您的位置:首页 > 运维架构

opencv_tutorial_code学习——角点检测方法

2017-12-21 14:20 471 查看
TrackingMotion\cornerDetector_Demo.cpp, cornerHarris_Demo.cpp , cornerSubPix_Demo.cpp, goodFeaturesToTrack_Demo.cpp


Harris角点检测

步骤:

1、灰度化

2、二值化

3、角点检测:cornerHarris( src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT );

4、角点归一化:normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );

5、范围处理:convertScaleAbs( dst_norm, dst_norm_scaled );

6、绘制角点:circle( dst_norm_scaled, Point( i, j ), 5,  Scalar(0), 2, 8, 0 );

cornerEigenValsAndVecs()
作用:计算图像块的特征值和特征向量用于角点检测。

形式:void cornerEigenValsAndVecs(InputArray src, OutputArray dst, int blockSize, int ksize, int borderType=BORDER_DEFAULT );

参数:

src:输入单通道8位或浮点图像;

dst:用来存储结果的图像;它有src相同的大小和类型为CV_32FC(6);

blockSize:领域尺寸;
ksize:Sobel()算子的孔径参数;
borderType:像素外推方式;

cornerMinEigenVal()
作用:计算梯度矩阵的最小特征值用于角点检测。
形式:void cornerMinEigenVal(InputArray src, OutputArray dst, int blockSize, int ksize=3, int borderType=BORDER_DEFAULT );
参数:
src:输入单通道8位或浮点图像;
dst:用来存储最小特征值的图像;它有src相同的大小和类型为CV_32FC1;
blockSize:领域尺寸;
ksize:Sobel()算子的孔径参数;
borderType:像素外推方式;

goodFeaturesToTrack——Shi-Tomasi角点检测

goodFeaturesToTrack有比cornerHarris更多的控制参数,函数原型:

void goodFeaturesToTrack( InputArray image, OutputArray corners,  

                                     int maxCorners, double qualityLevel, double minDistance,  

                                     InputArray mask=noArray(), int blockSize=3,  

                                     bool useHarrisDetector=false, double k=0.04 ); 
第一个参数image:8位或32位单通道灰度图像;

第二个参数corners:位置点向量,保存的是检测到的角点的坐标;

第三个参数maxCorners:定义可以检测到的角点的数量的最大值;

第四个参数qualityLevel:检测到的角点的质量等级,角点特征值小于qualityLevel*最大特征值的点将被舍弃;

第五个参数minDistance:两个角点间最小间距,以像素为单位;

第六个参数mask:指定检测区域,若检测整幅图像,mask置为空Mat();

第七个参数blockSize:计算协方差矩阵时窗口大小;

第八个参数useHarrisDetector:是否使用Harris角点检测,为false,则使用Shi-Tomasi算子;

第九个参数k:留给Harris角点检测算子用的中间参数,一般取经验值0.04~0.06。第八个参数为false时,该参数不起作用;

cornerSubPix()亚像素角点检测

goodFeaturesToTrack()提取到的角点只能达到像素级别,在很多情况下并不能满足实际的需求,这时,我们则需要使用cornerSubPix()对检测到的角点作进一步的优化计算,可使角点的精度达到亚像素级别。

void cv::cornerSubPix(  

    cv::InputArray image, // 输入图像  

    cv::InputOutputArray corners, // 角点(既作为输入也作为输出)  

    cv::Size winSize, // 区域大小为 NXN; N=(winSize*2+1)  

    cv::Size zeroZone, // 类似于winSize,但是总具有较小的范围,Size(-1,-1)表示忽略  

    cv::TermCriteria criteria // 停止优化的标准  

);  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: