首页 > 代码库 > OpenCV中feature2D学习——亚像素级角点检测(cornerSubPix)
OpenCV中feature2D学习——亚像素级角点检测(cornerSubPix)
概述
除了利用Harris进行角点检测和利用Shi-Tomasi方法进行角点检测外,还可以使用cornerEigenValsAndVecs()函数和cornerMinEigenVal()函数自定义角点检测函数。如果对角点的精度有更高的要求,可以用cornerSubPix()函数将角点定位到子像素,从而取得亚像素级别的角点检测效果。
cornerSubPix()函数
(1)函数原型
cornerSubPix()函数在角点检测中精确化角点位置,其函数原型如下:
C++: void cornerSubPix(InputArray image, InputOutputArray corners, Size winSize, Size zeroZone, TermCriteria criteria); C: void cvFindCornerSubPix(const CvArr* image, CvPoint2D32f* corners, int count, CvSize win, CvSize zero_zone, CvTermCriteria criteria);
(2)函数参数
函数参数说明如下:
image:输入图像
corners:输入角点的初始坐标以及精准化后的坐标用于输出。
winSize:搜索窗口边长的一半,例如如果winSize=Size(5,5),则一个大小为的搜索窗口将被使用。
zeroZone:搜索区域中间的dead region边长的一半,有时用于避免自相关矩阵的奇异性。如果值设为(-1,-1)则表示没有这个区域。
criteria:角点精准化迭代过程的终止条件。也就是当迭代次数超过criteria.maxCount,或者角点位置变化小于criteria.epsilon时,停止迭代过程。
代码示例
代码示例基于goodFeaturesToTrack()检测出来的角点,使用cornerSubPix()函数将角点位置精确到亚像素级精度。
/** * @使用cornerSubPix()函数在goodFeaturesToTrack()的角点检测基础上将角点位置精确到亚像素级别 * @author holybin */ #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace cv; using namespace std; /// 全局变量 Mat src, srcGray; int maxCorners = 10; //角点个数的最大值 int maxCornersThresh = 20; //角点个数最大值的上限(滑动条范围0-20) char* detectWindow = "detection"; char* refineWindow = "refinement"; /// 角点精准化函数声明 void doCornerRefinement( int, void* ); int main( int argc, char** argv ) { /// 载入图像并灰度化 src = http://www.mamicode.com/imread( "D://opencv_pic//house_small.jpg", 1 );>实验结果:
OpenCV中feature2D学习——亚像素级角点检测(cornerSubPix)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。