Opencv:在黑色背景中查找特定模式的步骤是什么?

时间:2014-11-21 09:24:26

标签: opencv

以下显示具有QR码的图像的轮廓:

enter image description here

从这张图片中我必须提取出我的投资回报率的二维码。为了获得这些轮廓,我使用了

findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

我手动绘制了这三条黄线只是为了表明我需要识别这些模式。一旦我知道这三个点的位置,我就会更容易找到QR码。

另一种颜色: enter image description here

所有二维码都有三个方框。比如这个样本:

enter image description here

请帮我继续。

注意:此图片还有另一个问题,那就是它是径向扭曲的,我暂时忽略了这一点。目前我只需要具有完整QR码的ROI。

更新

正如Micka所建议的那样,我应该寻找包含2个不同轮廓的所有这些轮廓(层次结构)。结果是所有垃圾轮廓都将被移除,只留下那三个盒子。

所以现在我的问题是如何通过调用以下函数从contours得到这样的轮廓:

findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

1 个答案:

答案 0 :(得分:0)

如果要过滤包含感兴趣轮廓的轮廓数,则应使用层次结构变量。可能的代码是:

void updateInclusionScores(std::vector< std::vector<int> > const& hierarchy, 
                           std::vector<int>& scores)
{
    for (size_t i = 0; i < hierarchy.size(); ++i)
    {
        scores[i] = 0;
        if (hierarchy[i][3] >= 0)
        {
            int current = i;
            while (hierarchy[current][3] >= 0)
            {
                current = hierarchy[current][3];
            }
        }
    }
}

然后,您可以根据scores中存储的包含计数来过滤轮廓。

(我故意忽略了分配scores和优化分数计算的问题。此外,应该有一种使用函数式编程来表达这种过滤操作的好方法,特别是在使用C ++ 11时,你看到了这个主意。)

作为替代方案,我还建议使用Hough变换计算线方向,然后从Hough例程找到的线构建方块。几年前使用这种方法来检测校准图案的平方,因为它对某些线交叉点的遮挡是稳健的(即图像中缺少方角)。