以下显示具有QR码的图像的轮廓:
从这张图片中我必须提取出我的投资回报率的二维码。为了获得这些轮廓,我使用了
findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
我手动绘制了这三条黄线只是为了表明我需要识别这些模式。一旦我知道这三个点的位置,我就会更容易找到QR码。
另一种颜色:
所有二维码都有三个方框。比如这个样本:
请帮我继续。
注意:此图片还有另一个问题,那就是它是径向扭曲的,我暂时忽略了这一点。目前我只需要具有完整QR码的ROI。
更新
正如Micka所建议的那样,我应该寻找包含2个不同轮廓的所有这些轮廓(层次结构)。结果是所有垃圾轮廓都将被移除,只留下那三个盒子。
所以现在我的问题是如何通过调用以下函数从contours
得到这样的轮廓:
findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
答案 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例程找到的线构建方块。几年前使用这种方法来检测校准图案的平方,因为它对某些线交叉点的遮挡是稳健的(即图像中缺少方角)。