如何在一张图片中检测出一个QR码的图案?

8

我正在开发一个QR码检测代码,需要在图像上定位查找模式(Finding Patterns, FP)。我已经创建了一个类似QR码角上方正方形的二进制模板:

FP = ones(9);
FP(2:8,2:8)=0;
FP(3:7,3:7)=1;
FP(4:6,4:6)=0;
figure;imshow(FP)

我尝试使用xcorr2查找与此模板最大相关性的图像点。但是,我的问题很明显:与图像上可能出现的QR码的实际大小相比,我的模板非常小。
有没有一种方法可以在不改变大小的情况下查找模式/掩码?还有另一种解决这个问题的方法吗?
这里有一个带有QR码的图像作为示例:enter image description here

请问你能同时发布一个带有二维码的图像样例吗?这是你正在应用遮罩的实际图像。 - kkuilla
完成了!我编辑了我的帖子并上传了一个测试图片。 - alvaro.delaserna
2
一些可能有用的关键词:"尺度不变模板匹配" - nkjt
1个回答

14
你不需要使用xcorr2。你应该在1维的扫描线中查找一个1:1:3:1:1(暗-亮-暗-亮-暗)的模式。
标准的第60页上有对参考检测算法的描述。
此外,ZXing是一个实现QR代码检测/识别的开源库,你可以参考他们的代码。 编辑:在每个扫描线上,计算连续的黑色像素和连续的白色像素。您将得到表示序列长度的整数列表。
然后从最长的黑色子序列开始,向其两侧查看。如果黑色子序列长度为300,则其相邻的白色子序列的长度应为50-150,并且它们的相邻黑色子序列的长度也应为50-150(这是由于标准中提出的0.5公差所致)。
因此,如果您找到这样的序列,就用大小为300的标记标记它。然后尝试下一个最长的黑色子序列,以此类推。 只是为了澄清,以上方法应用于寻找3个标记角落。

好的,我会尝试这样做,但如果我正在处理像我上传的那样的图像呢?在这种情况下,我无法寻找该模式(假设它是基于像素的),因为序列中涉及更多的像素,对吧? - alvaro.delaserna
我认为你需要对模式或参考图像进行缩放。但由于你是在一维而不是二维上进行操作,所以速度会更快。 - Michael Litvin
2
@alvaro.delaserna 我认为在图像中查找QR码和找到QR码内的角落是两个不同的问题。如果您首先尝试在图像中检测QR码(然后如果卡住了,再提出与您的代码相关的具体问题),裁剪出QR码,然后在裁剪后的图像中检测角落,您可能会取得更多进展。这可能不是检测角落的最快算法,但可能更容易获得帮助。 - kkuilla
这正是我所需要的,能够裁剪二维码。 - alvaro.delaserna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接