GVKun编程网logo

使用 opencv2 和 numpy(opencv和numpy对应版本)

4

如果您想了解使用opencv2和numpy和opencv和numpy对应版本的知识,那么本篇文章将是您的不二之选。我们将深入剖析使用opencv2和numpy的各个方面,并为您解答opencv和num

如果您想了解使用 opencv2 和 numpyopencv和numpy对应版本的知识,那么本篇文章将是您的不二之选。我们将深入剖析使用 opencv2 和 numpy的各个方面,并为您解答opencv和numpy对应版本的疑在这篇文章中,我们将为您介绍使用 opencv2 和 numpy的相关知识,同时也会详细的解释opencv和numpy对应版本的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

使用 opencv2 和 numpy(opencv和numpy对应版本)

使用 opencv2 和 numpy(opencv和numpy对应版本)

如何解决使用 opencv2 和 numpy

我有一些代码,主要取自这篇文章底部链接的各种来源,用 Python 编写,它获取形状为 [height,width] 的图像和一些 [x_min,y_min,x_max,y_max] 格式的边界框,两者都是numpy 数组,并逆时针旋转图像及其边界框。由于旋转后边界框变得更像“菱形”,即未轴对齐,因此我执行了一些计算以使其轴对齐。此代码的目的是通过使用旋转数据(其中水平或垂直翻转很常见)在训练对象检测神经网络时执行数据增强。看起来其他角度的翻转对于图像分类来说很常见,没有边界框,但是当有框时,如何翻转框以及图像的资源相对稀疏/利基。

似乎当我输入 45 度角时,我得到了一些不太“紧密”的边界框,因为四个角不是一个很好的注释,而原始的接近完美。

下图是 MS COCO 2014 对象检测数据集(训练图像)中的第一张图像,及其第一个边界框注释。我的代码如下:

import math
import cv2
import numpy as np

# angle assumed to be in degrees
# bbs a list of bounding Boxes in x_min,y_max format
def rotateImageAndBoundingBoxes(im,bbs,angle):
    h,w = im.shape[0],im.shape[1]
    (cX,cY) = (w//2,h//2) # original image center
    M = cv2.getRotationMatrix2D((cX,cY),angle,1.0) # 2 by 3 rotation matrix
    cos = np.abs(M[0,0])
    sin = np.abs(M[0,1])
    
    # compute the dimensions of the rotated image
    nW = int((h * sin) + (w * cos))
    nH = int((h * cos) + (w * sin))
    
    # adjust the rotation matrix to take into account translation of the new centre
    M[0,2] += (nW / 2) - cX
    M[1,2] += (nH / 2) - cY
    rotated_im = cv2.warpAffine(im,M,(nW,nH))

    rotated_bbs = []
    for bb in bbs:
        # get the four rotated corners of the bounding Box
        vec1 = np.matmul(M,np.array([bb[0],bb[1],1],dtype=np.float64)) # top left corner transformed
        vec2 = np.matmul(M,np.array([bb[2],dtype=np.float64)) # top right corner transformed
        vec3 = np.matmul(M,bb[3],dtype=np.float64)) # bottom left corner transformed
        vec4 = np.matmul(M,dtype=np.float64)) # bottom right corner transformed
        x_vals = [vec1[0],vec2[0],vec3[0],vec4[0]]
        y_vals = [vec1[1],vec2[1],vec3[1],vec4[1]]
        x_min = math.ceil(np.min(x_vals))
        x_max = math.floor(np.max(x_vals))
        y_min = math.ceil(np.min(y_vals))
        y_max = math.floor(np.max(y_vals))
        bb = [x_min,y_max]
        rotated_bbs.append(bb)
    
    // my function to resize image and bbs to the original image size
    rotated_im,rotated_bbs = resizeImageAndBoxes(rotated_im,w,h,rotated_bbs) 
    
    return rotated_im,rotated_bbs

好的边界框看起来像:

enter image description here

不太好的边界框看起来像:

enter image description here

我正在尝试确定这是我的代码错误还是预期行为?看起来这个问题在 pi/2 弧度(90 度)的整数倍时不太明显,但我想在任何旋转角度都实现紧密的边界框。任何见解都表示赞赏。

【数据增强讨论】 https://blog.paperspace.com/data-augmentation-for-object-detection-rotation-and-shearing/

[绕二维任意点旋转的数学] https://math.stackexchange.com/questions/2093314/rotation-matrix-of-rotation-around-a-point-other-than-the-origin

解决方法

在大多数情况下,这似乎是评论中的预期行为。我确实有一个解决这个问题的hacky解决方案,你可以写一个像

这样的函数
# assuming box coords = [x_min,y_min,x_max,y_max]
def cropBoxByPercentage(box_coords,image_width,image_height,x_percentage=0.05,y_percentage=0.05):
    box_xmin = box_coords[0]
    box_ymin = box_coords[1]
    box_xmax = box_coords[2]
    box_ymax = box_coords[3]
    box_width = box_xmax-box_xmin+1
    box_height = box_ymax-box_ymin+1
    dx = int(x_percentage * box_width)
    dy = int(y_percentage * box_height)
    box_xmin = max(0,box_xmin-dx)
    box_xmax = min(image_width-1,box_xmax+dx)
    box_ymin = max(0,box_ymax - dy)
    box_ymax = min(image_height - 1,box_ymax + dy)
    return np.array([box_xmin,box_xmax,box_ymin,box_ymax])

x_percentage 和 y_percentage 的计算可以使用固定值计算,也可以使用启发式计算。

centos6 安装 opencv2

centos6 安装 opencv2

环境

centos6.5

opencv2.4

python2.6(centos 自带的)

下载

opencv 可从 GitHub 下载 https://github.com/opencv/opencv/tree/2.4 可自行选择版本

 

安装 opencv

安装依赖包
yum install cmake gcc-c++ git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev -y
yum install ant -y(如果安装目录下需要 java,则需要安装 ant 依赖)

unzip opencv-2.4.zip
cd opencv-2.4
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/opt/opencv ..

make

make install

对应的 jar 包和库文件全部都有了,jar 包和 windows 下面的 jar 包是通用的,只需要将 libopencv_java2413.so 拷贝到 linux 系统下的 java.library.path 下面去即可

export $LD_LIBRARY_PATH 可以查看 java.library.path 的位置

或在环境变量中添加

LD_LIBRARY_PATH=/usr/local/tradeapi/os

export LD_LIBRARY_PATH

 

centos6.4 成功安装 opencv2.4.8(参考2.3.1)

centos6.4 成功安装 opencv2.4.8(参考2.3.1)

参考文献:http://www.cnblogs.com/zlbeidou/p/3209029.html

成功通过编译,显示结果如图。

正文:

系统环境介绍:

    centos 6.4

1.安装依赖包

    yum install cmake gcc gcc-c++ gtk+-devel gimp-devel gimp-devel-tools gimp-help-browser zlib-devel libtiff-devel libjpeg-devel libpng-devel gstreamer-devel libavc1394-devel libraw1394-devel libdc1394-devel jasper-devel jasper-utils swig python libtool nasm

2.生成make文件并安装

  //cd opencv 2.3.1 
    cd  opencv2.4.8 
  // (2.3.1)  cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=NO .
 (2.4.8) cmake CMakeLists.txt

  

  make
// (2.4.8)error:   /opencv248/opencv-2.4.8/cmake/cl2cpp.cmake:50 (string):   string does not recognize sub-command MD5

改错: 删除 cl2cpp.cmake 内的第50 行。重新 make
  sudo make install

3.配置

  新建文件 /etc/ld.so.conf.d/opencv.conf

  在文件中添加  /usr/local/lib

   保存之后执行配置

   sudo ldconfig

4.环境变量配置

   sudo vim /etc/bashrc(代码:位置随意,最后也行)

   PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
   export PKG_CONFIG_PATH

 保存(esc :wq)  之后执行

    source /etc/bashrc

5.测试安装是否成功

   cd   OpenCV-2.3.1/samples/c
   chmod +x build_all.sh
   ./build_all.sh

   编译结束之后执行

  ./facedetect cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --scale=1.5 lena.jpg

   如果安装成功的话,lena脸上会有一个蓝色的圈

 


numpy.random.random & numpy.ndarray.astype & numpy.arange

numpy.random.random & numpy.ndarray.astype & numpy.arange

今天看到这样一句代码:

xb = np.random.random((nb, d)).astype(''float32'') #创建一个二维随机数矩阵(nb行d列)
xb[:, 0] += np.arange(nb) / 1000. #将矩阵第一列的每个数加上一个值

要理解这两句代码需要理解三个函数

1、生成随机数

numpy.random.random(size=None) 

size为None时,返回float。

size不为None时,返回numpy.ndarray。例如numpy.random.random((1,2)),返回1行2列的numpy数组

 

2、对numpy数组中每一个元素进行类型转换

numpy.ndarray.astype(dtype)

返回numpy.ndarray。例如 numpy.array([1, 2, 2.5]).astype(int),返回numpy数组 [1, 2, 2]

 

3、获取等差数列

numpy.arange([start,]stop,[step,]dtype=None)

功能类似python中自带的range()和numpy中的numpy.linspace

返回numpy数组。例如numpy.arange(3),返回numpy数组[0, 1, 2]

numpy.ravel()/numpy.flatten()/numpy.squeeze()

numpy.ravel()/numpy.flatten()/numpy.squeeze()

numpy.ravel(a, order=''C'')

  Return a flattened array

numpy.chararray.flatten(order=''C'')

  Return a copy of the array collapsed into one dimension

numpy.squeeze(a, axis=None)

  Remove single-dimensional entries from the shape of an array.

 

相同点: 将多维数组 降为 一维数组

不同点:

  ravel() 返回的是视图(view),意味着改变元素的值会影响原始数组元素的值;

  flatten() 返回的是拷贝,意味着改变元素的值不会影响原始数组;

  squeeze()返回的是视图(view),仅仅是将shape中dimension为1的维度去掉;

 

ravel()示例:

 1 import matplotlib.pyplot as plt
 2 import numpy as np
 3 
 4 def log_type(name,arr):
 5     print("数组{}的大小:{}".format(name,arr.size))
 6     print("数组{}的维度:{}".format(name,arr.shape))
 7     print("数组{}的维度:{}".format(name,arr.ndim))
 8     print("数组{}元素的数据类型:{}".format(name,arr.dtype))
 9     #print("数组:{}".format(arr.data))
10     
11 a = np.floor(10*np.random.random((3,4)))
12 print(a)
13 log_type(''a'',a)
14 
15 a1 = a.ravel()
16 print("a1:{}".format(a1))
17 log_type(''a1'',a1)
18 a1[2] = 100
19 
20 print(a)
21 log_type(''a'',a)

 

flatten()示例

 1 import matplotlib.pyplot as plt
 2 import numpy as np
 3 
 4 def log_type(name,arr):
 5     print("数组{}的大小:{}".format(name,arr.size))
 6     print("数组{}的维度:{}".format(name,arr.shape))
 7     print("数组{}的维度:{}".format(name,arr.ndim))
 8     print("数组{}元素的数据类型:{}".format(name,arr.dtype))
 9     #print("数组:{}".format(arr.data))
10     
11 a = np.floor(10*np.random.random((3,4)))
12 print(a)
13 log_type(''a'',a)
14 
15 a1 = a.flatten()
16 print("修改前a1:{}".format(a1))
17 log_type(''a1'',a1)
18 a1[2] = 100
19 print("修改后a1:{}".format(a1))
20 
21 print("a:{}".format(a))
22 log_type(''a'',a)

 

squeeze()示例:

1. 没有single-dimensional entries的情况

 1 import matplotlib.pyplot as plt
 2 import numpy as np
 3 
 4 def log_type(name,arr):
 5     print("数组{}的大小:{}".format(name,arr.size))
 6     print("数组{}的维度:{}".format(name,arr.shape))
 7     print("数组{}的维度:{}".format(name,arr.ndim))
 8     print("数组{}元素的数据类型:{}".format(name,arr.dtype))
 9     #print("数组:{}".format(arr.data))
10     
11 a = np.floor(10*np.random.random((3,4)))
12 print(a)
13 log_type(''a'',a)
14 
15 a1 = a.squeeze()
16 print("修改前a1:{}".format(a1))
17 log_type(''a1'',a1)
18 a1[2] = 100
19 print("修改后a1:{}".format(a1))
20 
21 print("a:{}".format(a))
22 log_type(''a'',a)

从结果中可以看到,当没有single-dimensional entries时,squeeze()返回额数组对象是一个view,而不是copy。

 

2. 有single-dimentional entries 的情况

 1 import matplotlib.pyplot as plt
 2 import numpy as np
 3 
 4 def log_type(name,arr):
 5     print("数组{}的大小:{}".format(name,arr.size))
 6     print("数组{}的维度:{}".format(name,arr.shape))
 7     print("数组{}的维度:{}".format(name,arr.ndim))
 8     print("数组{}元素的数据类型:{}".format(name,arr.dtype))
 9     #print("数组:{}".format(arr.data))
10 
11 a = np.floor(10*np.random.random((1,3,4)))
12 print(a)
13 log_type(''a'',a)
14 
15 a1 = a.squeeze()
16 print("修改前a1:{}".format(a1))
17 log_type(''a1'',a1)
18 a1[2] = 100
19 print("修改后a1:{}".format(a1))
20 
21 print("a:{}".format(a))
22 log_type(''a'',a)

 

今天关于使用 opencv2 和 numpyopencv和numpy对应版本的讲解已经结束,谢谢您的阅读,如果想了解更多关于centos6 安装 opencv2、centos6.4 成功安装 opencv2.4.8(参考2.3.1)、numpy.random.random & numpy.ndarray.astype & numpy.arange、numpy.ravel()/numpy.flatten()/numpy.squeeze()的相关知识,请在本站搜索。

本文标签: