ArUco Marker检测原理

标记检测过程包括两个主要步骤:

  1. 检测候选marker
    在该步骤中,分析图像以找到作为标记的候选的正方形形状。 它首先进行自适应阈值处理以对标记进行分割,然后从阈值图像中提取轮廓,并丢弃那些非凸起或不接近正方形的轮廓。 还应用了一些额外的过滤(去除太小或太大的轮廓,去除彼此太近的轮廓等)。
  2. 在候选检测之后,有必要通过分析它们的内部编码来确定它们是否实际上是标记
    此步骤首先提取每个标记的标记位。 为此,首先,应用透视变换以获得其规范形式的标记。 然后,使用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=w0u0+w1u1。
    前景和背景图象的方差:g=w0*(u0-u)(u0-u)+w1(u1-u)(u1-u)=w0w1*(u0-u1)*(u0-u1),此公式为方差公式。
    参考链接:https://baike.baidu.com/item/otsu/16252828?fr=aladdin
    具体流程
  • Thresholding
    自适应阈值化
  • Contour filtering
    轮廓尺寸过滤
  • Bits extraction
    透视变换去除扭曲
    Otsu提取黑白位
    网格划分
  • Marker identification
  • Corner refinement(边框位置精确化)

你可能感兴趣的:(opencv,计算机视觉,opencv,机器学习)