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;