【OpenCV基础】第三十四课:自定义角点检测器

cv::cornerEigenValsAndVecs,cv::cornerMinEigenVal

Posted by x-jeff on August 21, 2022

本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.自定义角点检测器

我们利用Harris角点检测Shi-Tomasi角点检测中的$\lambda_1$和$\lambda_2$可以定义自己的响应函数,从而构建自定义角点检测器。

2.相关API

2.1.cv::cornerEigenValsAndVecs

用于计算矩阵$M$的特征值$\lambda_1, \lambda_2$。原理详见:Harris角点检测

1
2
3
4
5
6
7
void cornerEigenValsAndVecs( 
	InputArray src, 
	OutputArray dst,
	int blockSize, 
	int ksize,
	int borderType = BORDER_DEFAULT 
);

参数详解:

  1. InputArray src:输入图像,为8-bit单通道或浮点型图像。
  2. OutputArray dst:输出计算得到的特征值。大小和src一样,类型为CV_32FC(6)
  3. int blockSize:见cv::cornerHarris中的blockSize,含义和用法一样。
  4. int ksize:见cv::cornerHarris中的ksize,含义和用法一样。
  5. int borderType:边界填充方式,详见:【OpenCV基础】第十五课:边缘处理

CV_32FC(6)的定义见下:

1
2
3
4
5
#define CV_32FC1 CV_MAKETYPE(CV_32F,1)
#define CV_32FC2 CV_MAKETYPE(CV_32F,2)
#define CV_32FC3 CV_MAKETYPE(CV_32F,3)
#define CV_32FC4 CV_MAKETYPE(CV_32F,4)
#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))

当通道数大于4时就使用括号这种表示方法来指明通道数。类似的还有CV_8UC(n)CV_16UC(n)等等,在此不再一一列举。

dst的大小和src一样,六个通道存储了src中每一个像素点的特征值和特征向量:$(\lambda_1, \lambda_2, x_1 , y_1 , x_2,y_2)$。第1个和第2个通道存储了每个点的特征值;第3个和第4个通道存储了特征值$\lambda_1$对应的特征向量($x_1$为$x$方向的分量,$y_1$为$y$方向的分量);同理,第5个和第6个通道存储了特征值$\lambda_2$对应的特征向量。

2.2.cv::cornerMinEigenVal

用于计算矩阵$M$的较小特征值$\min (\lambda_1, \lambda_2)$。原理详见:Shi-Tomasi角点检测

1
2
3
4
5
6
7
void cornerMinEigenVal( 
	InputArray src, 
	OutputArray dst,
	int blockSize, 
	int ksize = 3,
	int borderType = BORDER_DEFAULT 
);

参数详解:

  1. InputArray src:同cv::cornerEigenValsAndVecs
  2. OutputArray dst:和src大小一样,保存每个点的最小特征值。类型为CV_32FC1
  3. int blockSize:同cv::cornerEigenValsAndVecs
  4. int ksize:同cv::cornerEigenValsAndVecs
  5. int borderType:同cv::cornerEigenValsAndVecs

3.代码地址

  1. 自定义角点检测器