1.角点位置亚像素位置优化原理介绍
亚像素优化的原理在于通过对初始角点位置的微小调整,利用更精确的灰度信息,来获取更准确的角点位置。传统的角点检测算法基于像素级别的灰度变化来定位角点,而亚像素优化则进一步利用图像灰度的局部变化进行更精细的插值,提高了角点位置的准确度。
2.优化角点亚像素位置函数cornerSubPix()
void cv::cornerSubPix( InputArray image,
InputOutputArray corners,
Size winSize,
Size zeroZone,
TermCriteria criteria
)
- image:输入图像,必须是CV 8U或者CV 32F的单通道灰度图像。
- corners: 角点坐标,既是输入的角点坐标又是精确后的角点坐标。
- winSize: 搜索窗口尺寸的一半,必须是整数。实际的搜索窗口尺寸比该参数的2倍大1。
- zeroZone: 搜索区域中间死区大小的一半,即不提取像素点的区域,(-1.-1)表示没有死区。
- criteria:终止角点优化迭代的条件。
示例代码:
void cornerSubPix_f(Mat mat){ //彩色图像转成灰度图像 Mat gray; cvtColor(mat,gray,COLOR_BGR2GRAY); //提取角点 int maxCorners=100;//检测角点数目 double quality_level=0.01;//质量等级 double minDistance=0.04;//两个角点之间的最小欧式距离 vector<Point2f> corners; goodFeaturesToTrack(gray,corners,maxCorners,quality_level,minDistance,Mat(),3, false); //计算亚像素级别角点坐标 vector<Point2f> cornersSub=corners;//角点备份,防止被函数修改 Size winSize=Size (5,5); Size zeroZone=Size(-1,-1); TermCriteria criteria = TermCriteria(TermCriteria::EPS+TermCriteria::COUNT,40,0.001); cornerSubPix(gray,cornersSub,winSize,zeroZone,criteria); //输出初始化坐标和精细坐标 for(size_t i=0;i<corners.size();i++){ ostringstream ss; string str= to_string(i); str="第"+str+"个角点初始坐标:"; ss<<str<<corners[i]<<" 精细后坐标:"<<cornersSub[i]<<endl; LOGD("%s",ss.str().c_str()); } }