【问题标题】:Segmentation of perspectively distorted barcodes透视扭曲条码的分割
【发布时间】:2015-07-16 08:42:21
【问题描述】:

图片中的条码有透视变形。

使用ZBar 定位和解码它们。

现在我不仅需要粗略的位置,还需要条形码的四个真实角点,它们定义了封闭的 4 点多边形。

我尝试了不同的方法,但还没有得到想要的结果。 其中之一是:

  • 将图像转换为灰度
  • 阈值图像
  • 腐蚀图像
  • floodFill 以已知为条形码一部分的像素开头
  • 获取 FloodFill 结果周围的轮廓

但是围绕这个轮廓,我现在需要找到最小的最佳拟合 4 点多边形,它似乎是 not that easy

您对更好的方法有什么想法吗?

【问题讨论】:

    标签: opencv barcode image-segmentation


    【解决方案1】:

    您可以使用以下代码并尝试通过 approxPoly 将轮廓减少为 4 点多边形

    向量近似值;

    for (size_t i = 0; i < contours.size(); i++)
    {
        approxPolyDP(Mat(contours[i]), approx, 
                 arcLength(Mat(contours[i]), true)*0.02, true);
    
        if (approx.size() == 4 &&
            fabs(contourArea(Mat(approx))) > 1000 &&
            isContourConvex(Mat(approx)))
        {
            double maxCosine = 0;
    
            for( int j = 2; j < 5; j++ )
            {
                double cosine = fabs(angle(approx[j%4], approx[j-2], approx[j-1]));
                maxCosine = MAX(maxCosine, cosine);
            }
    
            if( maxCosine < 0.3 )
                squares.push_back(approx);
        }
    }
    

    http://opencv-code.com/tutorials/detecting-simple-shapes-in-an-image/

    您也可以尝试以下方法,也许它们会为您产生足够好的效果: http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=minarearect#minarearect

    http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=convexhull#convexhull

    【讨论】:

    • minAreaRect 不够精确,因为条形码不仅被旋转和缩放,而且在透视上也发生了扭曲。 convehull 和 approxPolyDP 不能保证准确给出四个点。我当然可以为 approxPolyDP 尝试不同的 epsilon,直到结果中恰好有四个点,但这也不能保证这将是我正在寻找的四个角。在最坏的情况下,根本没有 epsilon 来返回一个四点多边形。
    【解决方案2】:

    好的,我找到了一个适合我的用例的解决方案。

    首先从 ZBar 结果生成一条扫描线。

    现在在cv::adaptivethreshold 产生的图像的版本中找到第一个和最后一个黑色像素,blockSize 足够大。

    从那里开始,使用cv::findContours 分割第一个和最后一个条。

    现在对于两端条,搜索彼此距离最远的两个轮廓点。

    他们最终定义了封闭的 4 点多边形。

    这与我在问题中发布的内容不完全一样,但由于拉长的保护图案而导致的额外尺寸对我来说并不重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      相关资源
      最近更新 更多