标记检测过程包括两个主要步骤:
-
检测候选marker
在该步骤中,分析图像以找到作为标记的候选的正方形形状。 它首先进行
自适应阈值处理
以对标记进行分割,然后从阈值图像中
提取轮廓
,并丢弃那些非凸起或不接近正方形的轮廓。 还应用了一些额外的过滤(去除太小或太大的轮廓,去除彼此太近的轮廓等)。 -
在候选检测之后,有必要通过分析它们的内部编码来确定它们是否实际上是标记
此步骤首先提取每个标记的标记位。 为此,首先,应用
透视变换
以获得其规范形式的标记。 然后,使用
Otsu
对规范图像进行阈值处理以分离白色和黑色位。 根据标记大小和边界大小将图像分成不同的单元格,并计算每个单元格上的黑色或白色像素的数量,以确定它是白色还是黑色位。 最后,分析比特以确定标记是否属于特定字典,并且在必要时采用纠错技术。
参考链接:
https://blog.csdn.net/kyjl888/article/details/72843940
自适应阈值处理
adaptiveThreshold(_in, _out, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY_INV, winSize, constant);
adaptiveThreshWinSizeMin(3),
adaptiveThreshWinSizeMax(23),
adaptiveThreshWinSizeStep(10),
数字越大,二值化以后的边缘越粗
参考:
https://blog.csdn.net/u010566411/article/details/54317416
提取轮廓
static void _findMarkerContours(InputArray _in, vector< vector< Point2f > > &candidates,
vector< vector< Point > > &contoursOut, double minPerimeterRate,
double maxPerimeterRate, double accuracyRate,
double minCornerDistanceRate, int minDistanceToBorder)
透视变换
Otsu
threshold(resultImg, resultImg, 125, 255, THRESH_BINARY | THRESH_OTSU);
-
最大类间方差法原理
利用阈值将原图像分成前景,背景两个图象。 -
关于最大类间方差法(otsu)的性能:
类间方差法对噪音和目标大小十分敏感,它仅对类间方差为单峰的图像产生较好的分割效果。
当目标与背景的大小比例悬殊时,类间方差准则函数可能呈现双峰或多峰,此时效果不好,但是类间方差法是用时最少的。 -
最大类间方差法(otsu)的公式推导:
记t为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。
则图像的总平均灰度为:u=w0
u0+w1
u1。
前景和背景图象的方差:g=w0*(u0-u)
(u0-u)+w1
(u1-u)
(u1-u)=w0
w1*(u0-u1)*(u0-u1),此公式为方差公式。
参考链接:
https://baike.baidu.com/item/otsu/16252828?fr=aladdin
具体流程
-
Thresholding
自适应阈值化 -
Contour filtering
轮廓尺寸过滤 -
Bits extraction
透视变换去除扭曲
Otsu提取黑白位
网格划分 - Marker identification
- Corner refinement(边框位置精确化)
版权声明:本文为weixin_41528941原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。