透视扭曲条形码的分割

Segmentation of perspectively distorted barcodes

有些图像中的条形码存在透视变形。

它们使用 ZBar 进行定位和解码。

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

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

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

您有更好的方法吗?

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

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

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

现在在 cv::adaptivethreshold 的图像版本中发现了第一个和最后一个黑色像素,具有足够大的 blockSize

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

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

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

这与我在问题中发布的内容不完全相同,但由于加长保护图案而导致的额外尺寸对我来说无关紧要。