棋盘格角点提取
参考资料
1、论文
Geiger A, Moosmann F, Car Ö, et al. Automatic camera and range sensor calibration using a single shot[C]//Robotics and Automation (ICRA), 2012 IEEE International Conference on. IEEE, 2012: 3936-3943.
2、代码网站
http://www.cvlibs.net/software/libcbdetect/
算法原理介绍
1. 棋盘格角点粗提取
使用两种滤波器,对图片做滤波处理,建议使用高斯滤波器
对于第i个模型中的A高斯核对图像做卷积有 (例如 :有1*11的高斯核可以看成左上,右上,左下,右下角有数字,其他位置填0)
对于所有的像素点我们可以获得c(Corner likelihood)值
其中:
上述两张图片代表角点的两种情况,假设该点定义角点 ,左上角图像在 , 像素值大于 ,,
因此,min(,) - 等同于像素值大的值减去4个格子的均值,该值大于0。
-min(,) 等同于减去4个格子的均值像素值小的值,该值大于0。
取两种值最小的作为结果。
如所示:
对于右边图片使用公式,就会出现min(,) - 和 -min(,) 都负值,后期通过阈值过滤时就会被滤除,故引出了的公式,综合两种情况寻找角点。下图为原图片和根据c值生成的图片。
获取到角点位置以后,在Cornerlikelihood图片里使用非极大值抑制算法,去除干扰点。
代码中对于NMS算法首先搜索NN区域中的最大值,确定最大值位置,在该位置NN区域中确定该点是否为最大值,确定则保留该点否为继续下一次循环。
利用Soble计算出X,Y方向的梯度,角度和权重。
首先我们将粗提取的角点周围N*N窗口内所有的梯度方向映射到一个32bin的直方图里(180°分成了32份),用梯度幅值(权重)作为加权值,使用找到最大的两个幅值作为模态a1,a2(直方图做一个高斯平滑,使用meanshift找到两个极大值)对应模态a1,a2的角度为,,变成m1(Cos(),Sin()),作为方向。
2. 亚像素级角点和方向的精细化
对于亚像素角点的提取,论文分成两个部分,一个是优化角点的位置,第二个是优化角点的边缘方向
2.1 精细化角点位置
该方程属于典型的最小二乘问题,对于所有的AX=b问题,通过最小二乘法,可以变成
因此就可以将上述问题变成:
可以根据图像梯度获得一下方程:
2.2 精细化角点方向对于精细化方向论文中提出了三个公式:
思想是最小化图像梯度和他们的法线方向的偏差,即梯度方向和法线方向是垂直的。原文中提出了该方程使用SVD分解出最小特征值和最小特征向量,取最小特征值地下的特征向量最小角点的精细化方向。
该方法可以理解为求解AX=0 且 ||X||=1问题。即解的最小特征值对应的特征向量。
就此所有角点的精细化完成。