透视扭曲条形码的分割

时间:2015-07-16 08:42:22

标签: opencv barcode image-segmentation

图像中有透视扭曲的条形码。

enter image description here

使用ZBar找到并解码它们。

zbar barcode location

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

enter image description here

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

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

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用以下代码并尝试通过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

答案 1 :(得分:2)

好的,我找到了一个对我的用例来说足够好的解决方案。

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

scanline

现在第一个和最后一个黑色像素位于cv::adaptivethreshold得到的图像的正面,且blockSize足够大。

first and last black pixels

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

first and last bar

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

bar ends

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

four point poly

这不完全是我在我的问题中发布的内容,但由于细长的防护模式而增加的尺寸在我的情况下并不重要。