本文为原创文章,未经本人允许,禁止转载。转载请注明出处。
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
);
参数详解:
InputArray src
:输入图像,为8-bit单通道或浮点型图像。OutputArray dst
:输出计算得到的特征值。大小和src
一样,类型为CV_32FC(6)
。int blockSize
:见cv::cornerHarris
中的blockSize,含义和用法一样。int ksize
:见cv::cornerHarris
中的ksize,含义和用法一样。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
);
参数详解:
InputArray src
:同cv::cornerEigenValsAndVecs
。OutputArray dst
:和src
大小一样,保存每个点的最小特征值。类型为CV_32FC1
。int blockSize
:同cv::cornerEigenValsAndVecs
。int ksize
:同cv::cornerEigenValsAndVecs
。int borderType
:同cv::cornerEigenValsAndVecs
。