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 // 停止优化的标准
);
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 // 停止优化的标准
);
相关文章推荐
- opencv_tutorial_code学习——Mat创建方法
- opencv_tutorial_code学习——canny边缘检测后findContours
- opencv_tutorial_code学习——图片叠加
- OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(Canny边缘检测)
- opencv_tutorial_code学习——compareHist直方图比较
- opencv_tutorial_code学习——图像滤波与风格化
- opencv_tutorial_code学习——opencv1语句
- opencv_tutorial_code学习——seamless cloning无缝融合、局部颜色变换、去高光镜面反射、平滑纹理
- opencv_tutorial_code学习——moments()中心距&面积&边长
- opencv_tutorial_code学习——matchTemplate模板匹配
- OpenCV中特征检测,提取与匹配使用方法学习
- opencv_tutorial_code学习——pointPolygonTest计算点到轮廓的距离
- opencv_tutorial_code学习——findContours&drawContours&画最小包围矩形&画最小包围圆
- opencv_tutorial_code学习——hdr_imaging
- opencv学习笔记1::访问图像中像素的三类方法(用指针,迭代器,动态地址)代码及用时检测
- opencv_tutorial_code学习——equalizeHist直方图均衡化
- opencv_tutorial_code学习——画最小包围旋转矩形&画最小包围椭圆
- opencv_tutorial_code学习——建缩减表、计时、扫描图片
- opencv_tutorial_code学习——FloodFill漫水填充和物体选取
- opencv_tutorial_code学习——画凸包convexHull()