图像特征在视觉里面是必不可少的,对特征的处理也是重中之重,不会计算图像特征,很多操作都将无法进行,下面是opencv3种计算图像特征的函数,这里对它们的构成和使用做点简单介绍。
PreCornerDetect
计算用于角点检测的特征图,
void cvPreCornerDetect( const CvArr* image, CvArr* corners, int aperture_size=3 );
- image
- 输入图像.
- corners
- 保存候选角点的特征图
- aperture_size
- Sobel 算子的核大小(见cvSobel).
其中 D.表示一阶图像差分,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),然后在邻域上计算图像差分的相关矩阵:
然后它计算矩阵的特征值和特征向量,并且按如下方式(λ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)
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/241683.html