二维码检测哪家强?五大开源库测评比较

640?wx_fmt=jpeg

作者 | 周强

来源 | 我爱计算机视觉(ID:aicvml)

二维码已经进入人们的日常生活中,尤其是日本Denso Wave公司1994年发明的QR码,由于其易于检测、写入信息量大、提供强大的纠错机制,应用最为广泛,可说是名副其实的第一大图像识别应用。

640?wx_fmt=png

QR码的检测和解码成为很多应用开发的必备,面对众多的开源库,到底哪一种是比较好的呢?

BoofCV的作者Peter Abeles对较有影响力的五大开源库中检测算法进行了比较,值得大家参考。

参与比较的开源库

  • BoofCV (Ver. 0.33):一种用Java实现的开源、实时的计算机视觉库;

http://boofcv.org/

  • OpenCV (Ver. 4.0.1):OpenCV 4.0后加入了QR码检测和解码功能,C++实现;

http://opencv.org/

  • Quirc (Feb 1, 2018. SHA 307473db):一种专门面向QR码的检测和解码库,C语言实现;

  • ZBar (Ver. 0.10):一种被广泛使用的包含各种条码检测识别的专门库,支持各种平台,支持Python, Perl, C++等语言;

  • ZXing (Ver. 3.3.3):一种面向Java Android开发的各种条码检测识别库,用Java开发,支持多种语言;

图像分类

为全方位比较各个开源库检测QR码的性能,作者收集了在应用中大量常见的情况。包括模糊、阴影、高光、扭曲、被涂损等15种情况,如下图:

640?wx_fmt=png

各类别包含的图像数:

640?wx_fmt=png

检测结果

作者以检测到的位置和标签位置重合10%为阈值定义检测成功,计算true positives, false positives, true negatives, 与 false negatives,并最终计算F-Measure来比较检测结果。


  • 分类别的检测结果统计


640?wx_fmt=png

  • 不分类别的全局统计:


640?wx_fmt=png

可见,没有哪个库处于统治地位完全比其他库更好,但BoofCV在大多数情况下为最好或者接近次好。Zbar在大多数类别下比ZXing好,但在ZXing最擅长的类别,Zbar不够好。quirc在一般情况下都表现良好,但在其他库表现最好的类别却不是很好。OpenCV则是毫无疑问总是最差。

  • 检测速度结果比较:

640?wx_fmt=png

在哪一类别的表现均一致,ZXing是最快的库,BoofCV次之。OpenCV的速度表现很稳定,最慢。。。

结论

选择哪个库取决于你的应用,如果二维码比较标准建议BoofCV,它的检测精度高而且速度也很好,如果二维码有污损或外观变化,ZXing是不错的选择。如果只能使用C++,则推荐Zbar。(反正OpenCV是不被推荐的!)


(*本文为 AI科技大本营转载文章,转载请联系作者)


福利时刻



入群参与每周抽奖~

扫码添加小助手,回复:大会,加入福利群,参与抽奖送礼!

640?wx_fmt=jpeg

大会5折优惠票倒计时 2 天! 团购还享立减优惠,倒计时 2 天!此外,伯克利大学名师精髓课程移师北京。《动手学深度学习》作者、亚马逊首席科学家李沐线下亲授「深度学习实训营」,免费GPU资源,现场还将限量赠送价值85元的配套书籍一本,先到先得。原价1099元,限时专享CSDN 独家福利价199元识别海报二维码,即刻购票~

640?wx_fmt=png

推荐阅读

640?wx_fmt=png

你点的每个“在看”,我都认真当成了喜欢

迈创二维码检测(MC QR Code Detection Library)是一款基于C++的开源二维码检测。该具有高效、准确、轻量级等优点,使用方便。以下是使用该的说明: 1. 下载并安装OpenCV(如果尚未安装); 2. 下载并解压迈创二维码检测; 3. 在代码中包含头文件“mc_qrcode_detection.h”; 4. 创建一个MCQRCodeDetection对象,并调用它的detectQRCode函数; 5. detectQRCode函数有两个参数:输入图像和一个存储二维码信息的字符串变量; 6. 如果detectQRCode函数返回true,则说明成功检测二维码二维码信息存储在字符串变量中; 7. 如果detectQRCode函数返回false,则说明未能检测二维码。 以下是一个简单的示例代码: ``` #include "mc_qrcode_detection.h" #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat img = imread("qrcode.jpg", IMREAD_GRAYSCALE); // 读入图像 if (img.empty()) { cout << "Failed to read the image!" << endl; return -1; } MCQRCodeDetection qrcodeDetector; // 创建MCQRCodeDetection对象 string qrcodeInfo; // 存储二维码信息的字符串变量 if (qrcodeDetector.detectQRCode(img, qrcodeInfo)) // 检测二维码 { cout << "QR code detected: " << qrcodeInfo << endl; // 输出二维码信息 } else { cout << "Failed to detect the QR code!" << endl; } return 0; } ``` 在上面的代码中,我们读入了一张包含二维码的图像,并创建了一个MCQRCodeDetection对象。然后,我们调用detectQRCode函数来检测二维码,如果成功检测二维码,则输出其信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值