目的
检测出棋盘格角点亚像素位置
原理
- 大致原理
二值化-膨胀白色块-画矩形出后进行轮廓提取-直线拟合判断是否为四条边-查找领域的四边形-角点排序
二值化
1.1 二值化(opencv争对棋盘格的)
- 计算直方图(每个像数值的数量)
- 平滑直方图
- 计算图像直方图的梯度得到梯度直方图 (做差)。
- 满足以下条件则为局部最大值
- 梯度图直方图中前小于零后大于零
- 直方图中前中后累加大于于总像素数1%
- 然后判断局部最大值个数
- ==0则认为是黑白图,
- ==1则把这个最大值除以2,==2则加起来除以2
- 其他,则强度直方图累加18%(因为棋盘格图片)的位置为白色阈值,再往前找最大值为黑色阈值,两者相减除以2,然后在被白色阈值相减。
1.2 补充 OTSU算法(二值化)
原理(计算一个分割阈值):
-
选择使得划分出来的前景与背景有最大方差的划分为最优划分。
-
几何上理解算法原理
1.计算全局灰度值均值
2.计算前、后背景的均值和全局均值的平方差再乘各自的前后像素占比即为类间方差,使用0-255带入计算,找到最大类间方差 -
以下为计算最大类间方差步骤:
-
优点:计算简单快速,不受图像亮度和对比度的影响。
-
缺点:噪声的干扰大,当图像没有典型的双峰时,不能够精确分割,对于多峰图像则失去效果。
-
知识点补充
1.类间方差:
标准差:标准差是数值分散的测量。方差的平方根
方差:离平均的平方距离的平均
膨胀
膨胀白色像素,断掉黑色素的衔接
画矩形框架
方便轮廓提取 rectangle
提取轮廓
cvFindContours
选出矩形
boundingRect 对矩形面积做判断 小于阈值则不要
直线拟合判断是否为四条边
approxPolyDP
找到相邻四边形
findQuadNeighbors :找到四边形的邻居
找到四边形的邻居,判断条件是是否公用一个角点(计算两个角点的距离,小于某个阈值则认为是相同的)(还没看原理)
排序
orderFoundConnectedQuads
利用角点进行排序,举个例子,举个例子,如果有四个四边形A,B,C,D,如果A与B共享一个角点,B与C共享一个角点,C与D共享一个角点,那么可以得出A,B,C,D的排列顺序。(还没看原理)
1.4 亚像素角点检测
网址
算法原理:
利用的是待求点满足Gi*(q-pi)=0,再利用最小二乘法