logo资料库

OPENCV函数手册(中文).pdf

第1页 / 共282页
第2页 / 共282页
第3页 / 共282页
第4页 / 共282页
第5页 / 共282页
第6页 / 共282页
第7页 / 共282页
第8页 / 共282页
资料共282页,剩余部分请下载后查看
cv参考手册
cxcore参考手册
highgui参考手册
CV 参考手册 HUNNISH 注: 本翻译是直接根据 OpenCV Beta 4.0 版本的用户手册翻译的,原文件是: /doc/ref/opencvref_cv.htm, 可以从 SOURCEFORG 上面的 OpenCV 项目下载,也可以直接从 阿须数码 中下载: http://www.assuredigit.com/incoming/sourcecode/opencv/chinese_docs/ref/open cvref_cv.htm。 翻译中肯定有不少错误,另外也有些术语和原文语义理解不透导致翻译不准确或者错 误,也请有心人赐教。 图像处理、结构分析、运动分析和对象跟踪部分由 R.Z.LIU 翻译,模式识别、照相机定 标与三维重建部分由 H.M.ZHANG 翻译,全文由 Y.C.WEI 统一修改校正。 • 图像处理 o 梯度, 边缘和角点 o 采样 差值和几何变换 o 形态学操作 o 滤波和彩色变换 o 金字塔及其应用 o 连接组件 o 图像和轮廓矩 o 特殊图像变换 o 直方图 o 匹配 • 结构分析 o 轮廓处理 o 计算几何 o 平面划分 • 运动分析和对象跟踪 o 背景统计量的累积 o 运动模板 o 对象跟踪 o 光流 o 预估器 • 模式识别 o 目标检测 • 照相机定标和三维重建 o 照相机定标 o 姿态估计
o 极线几何 • 函数列表 • 参考 图像处理 注意: 本章描述图像处理和分析的一些函数。其中大多数函数都是针对两维象素数组的,这里, 我们称这些数组为“图像”,但是它们不一定非得是 IplImage 结构,也可以是 CvMat 或者 CvMatND 结构。 梯度、边缘和角点 Sobel 使用扩展 Sobel 算子计算一阶、二阶、三阶或混合图像差分 void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 ); src 输入图像. dst 输出图像. xorder x 方向上的差分阶数 yorder y 方向上的差分阶数 aperture_size 扩展 Sobel 核的大小,必须是 1, 3, 5 或 7。 除了尺寸为 1, 其它情况下, aperture_size ×aperture_size 可分离内核将用来计算差分。对 aperture_size=1 的情况, 使用 3x1 或 1x3 内核 (不进行高斯平滑操作)。这里有一个特殊变量 CV_SCHARR (=-1),对应 3x3 Scharr 滤波器,可以给出比 3x3 Sobel 滤波更精确的结果。Scharr 滤波器系数是: | -3 0 3| |-10 0 10| | -3 0 3| 对 x-方向 以及转置矩阵对 y-方向。 函数 cvSobel 通过对图像用相应的内核进行卷积操作来计算图像差分: dst(x,y) = dxorder+yodersrc/dxxorder•dyyorder |(x,y)
由于 Sobel 算子结合了 Gaussian 平滑和微分,所以,其结果或多或少对噪声有一定的鲁棒性。通 常 情 况, 函数 调 用采 用如 下 参数 (xorder=1, yorder=0, aperture_size=3) 或 (xorder=0, yorder=1, aperture_size=3) 来计算一阶 x- 或 y- 方向的图像差分。第一种情况对应: |-1 0 1| |-2 0 2| |-1 0 1| 核。第二种对应 |-1 -2 -1| | 0 0 0| | 1 2 1| or | 1 2 1| | 0 0 0| |-1 -2 -1| 核的选则依赖于图像原点的定义 (origin 来自 IplImage 结构的定义)。由于该函数不进行图像尺 度变换,所以和输入图像(数组)相比,输出图像(数组)的元素通常具有更大的绝对数值(译者注:即 象素的深度)。为防止溢出,当输入图像是 8 位的,要求输出图像是 16 位的。当然可以用函数函 数 cvConvertScale 或 cvConvertScaleAbs 转换为 8 位的。除了 8-比特 图像,函数也接受 32-位 浮 点数图像。所有输入和输出图像都必须是单通道的,并且具有相同的图像尺寸或者 ROI 尺寸。 Laplace 计算图像的 Laplacian 变换 void cvLaplace( const CvArr* src, CvArr* dst, int aperture_size=3 ); src 输入图像. dst 输出图像. aperture_size 核大小 (与 cvSobel 中定义一样). 函数 cvLaplace 计算输入图像的 Laplacian 变换,方法是先用 sobel 算子计算二阶 x- 和 y- 差分,再求和: dst(x,y) = d2src/dx2 + d2src/dy2 对 aperture_size=1 则给出最快计算结果,相当于对图像采用如下内核做卷积: |0 1 0| |1 -4 1| |0 1 0| 类似于 cvSobel 函数,该函数也不作图像的尺度变换,所支持的输入、输出图像类型 的组合和 cvSobel 一致。
Canny 采用 Canny 算法做边缘检测 void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size=3 ); image 输入图像. edges 输出的边缘图像 threshold1 第一个阈值 threshold2 第二个阈值 aperture_size Sobel 算子内核大小 (见 cvSobel). 函数 cvCanny 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘。 threshold1 和 threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘 的初始分割。 PreCornerDetect 计算用于角点检测的特征图, void cvPreCornerDetect( const CvArr* image, CvArr* corners, int aperture_size=3 ); image 输入图像. corners 保存候选角点的特征图 aperture_size Sobel 算子的核大小(见 cvSobel). 函数 cvPreCornerDetect 计算函数 Dx D?? 表示二阶图像差分。 角点被认为是函数的局部最大值: 2Dyy+Dy 2Dxx - 2DxDyDxy 其中 D? 表示一阶图像差分, // 假设图像格式为浮点数 IplImage* corners = cvCloneImage(image); IplImage* dilated_corners = cvCloneImage(image); IplImage* corner_mask = cvCreateImage( cvGetSize(image), 8, 1 ); cvPreCornerDetect( image, corners, 3 ); cvDilate( corners, dilated_corners, 0, 1 ); cvSubS( corners, dilated_corners, corners ); cvCmpS( corners, 0, corner_mask, CV_CMP_GE );
cvReleaseImage( &corners ); cvReleaseImage( &dilated_corners ); CornerEigenValsAndVecs 计算图像块的特征值和特征向量,用于角点检测 void cvCornerEigenValsAndVecs( const CvArr* image, CvArr* eigenvv, int block_size, int aperture_size=3 ); image 输入图像. eigenvv 保存结果的数组。必须比输入图像宽 6 倍。 block_size 邻域大小 (见讨论). aperture_size Sobel 算子的核尺寸(见 cvSobel). 对每个象素,函数 cvCornerEigenValsAndVecs 考虑 block_size × block_size 大小 的邻域 S(p),然后在邻域上计算图像差分的相关矩阵: | sumS(p)(dI/dx)2 sumS(p)(dI/dx•dI/dy)| M = | | | sumS(p)(dI/dx•dI/dy) sumS(p)(dI/dy)2 | 然后它计算矩阵的特征值和特征向量,并且按如下方式(λ1, λ2, x1, y1, x2, y2)存储 这些值到输出图像中,其中 λ1, λ2 - M 的特征值,没有排序 (x1, y1) - 特征向量,对 λ1 (x2, y2) - 特征向量,对 λ2 CornerMinEigenVal 计算梯度矩阵的最小特征值,用于角点检测 void cvCornerMinEigenVal( const CvArr* image, CvArr* eigenval, int block_size, int aperture_size=3 ); image 输入图像. eigenval 保存最小特征值的图像. 与输入图像大小一致 block_size 邻域大小 (见讨论 cvCornerEigenValsAndVecs). aperture_size Sobel 算子的核尺寸(见 cvSobel). 当输入图像是浮点数格式时,该参数表示用来计算差分固
定的浮点滤波器的个数. 函数 cvCornerMinEigenVal 与 cvCornerEigenValsAndVecs 类似,但是它仅仅计算和 存储每个象素点差分相关矩阵的最小特征值,即前一个函数的 min(λ1, λ2) FindCornerSubPix 精确角点位置 void cvFindCornerSubPix( const CvArr* image, CvPoint2D32f* corners, int count, CvSize win, CvSize zero_zone, CvTermCriteria criteria ); image 输入图像. corners 输入角点的初始坐标,也存储精确的输出坐标 count 角点数目 win 搜索窗口的一半尺寸。如果 win=(5,5) 那么使用 5*2+1 × 5*2+1 = 11 × 11 大小的搜索窗口 zero_zone 死区的一半尺寸,死区为不对搜索区的中央位置做求和运算的区域。它是用来避免自相关矩 阵出现的某些可能的奇异性。当值为 (-1,-1) 表示没有死区。 criteria 求角点的迭代过程的终止条件。即角点位置的确定,要么迭代数大于某个设定值,或者是精 确度达到某个设定值。 criteria 可以是最大迭代数目,或者是设定的精确度,也可以是 它们的组合。 函数 cvFindCornerSubPix 通过迭代来发现具有子象素精度的角点位置,或如图所示的 放射鞍点(radial saddle points)。 子象素级角点定位的实现是基于对向量正交性的观测而实现的,即从中央点 q 到其邻域 点 p 的向量和 p 点处的图像梯度正交(服从图像和测量噪声)。考虑以下的表达式:
εi=DIpi 其中,DIpi 表示在 q 的一个邻域点 pi 处的图像梯度,q 的值通过最小化 εi 得到。通过将 εi 设为 0, 可以建立系统方程如下: sumi(DIpi•DIpi T)•q - sumi(DIpi•DIpi T•(q-pi) T•pi) = 0 其中 q 的邻域(搜索窗)中的梯度被累加。调用第一个梯度参数 G 和第二个梯度参数 b, 得到: q=G-1•b 该算法将搜索窗的中心设为新的中心 q,然后迭代,直到找到低于某个阈值点的中心位 置。 GoodFeaturesToTrack 确定图像的强角点 void cvGoodFeaturesToTrack( const CvArr* image, CvArr* eig_image, CvArr* temp_image, CvPoint2D32f* corners, int* corner_count, double quality_level, double min_distance, const CvArr* mask=NULL ); image 输入图像,8-位或浮点 32-比特,单通道 eig_image 临时浮点 32-位图像,尺寸与输入图像一致 temp_image 另外一个临时图像,格式与尺寸与 eig_image 一致 corners 输出参数,检测到的角点 corner_count 输出参数,检测到的角点数目 quality_level 最大最小特征值的乘法因子。定义可接受图像角点的最小质量因子。 min_distance 限制因子。得到的角点的最小距离。使用 Euclidian 距离 mask ROI:感兴趣区域。函数在 ROI 中计算角点,如果 mask 为 NULL,则选择整个图像。 函数 cvGoodFeaturesToTrack 在图像中寻找具有大特征值的角点。该函数,首先用 cvCornerMinEigenVal 计算输入图像的每一个象素点的最小特征值,并将结果存储到变 量 eig_image 中。然后进行非最大值抑制(仅保留 3x3 邻域中的局部最大值)。下一 步将最小特征值小于 quality_level•max(eig_image(x,y)) 排除掉。最后,函数确保 所有发现的角点之间具有足够的距离,(最强的角点第一个保留,然后检查新的角点与 已有角点之间的距离大于 min_distance )。
采样、差值和几何变换 InitLineIterator 初始化线段迭代器 int cvInitLineIterator( const CvArr* image, CvPoint pt1, CvPoint pt2, CvLineIterator* line_iterator, int connectivity=8 ); image 带采线段的输入图像. 线段起始点 pt1 pt2 线段结束点 line_iterator 指向线段迭代器状态结构的指针 connectivity 被扫描线段的连通数,4 或 8. 函数 cvInitLineIterator 初始化线段迭代器,并返回两点之间的象素点数目。两个点 必须在图像内。当迭代器初始化后,连接两点的光栅线上所有点,都可以连续通过调用 CV_NEXT_LINE_POINT 来得到。线段上的点是使用 4-连通或 8-连通利用 Bresenham 算法逐点计算的。 例子:使用线段迭代器计算彩色线上象素值的和 CvScalar sum_line_pixels( IplImage* image, CvPoint pt1, CvPoint pt2 ) { CvLineIterator iterator; int blue_sum = 0, green_sum = 0, red_sum = 0; int count = cvInitLineIterator( image, pt1, pt2, &iterator, 8 ); for( int i = 0; i < count; i++ ){ blue_sum += iterator.ptr[0]; green_sum += iterator.ptr[1]; red_sum += iterator.ptr[2]; CV_NEXT_LINE_POINT(iterator); /* print the pixel coordinates: demonstrates how to calculate the coordinates */ { int offset, x, y;
分享到:
收藏