「乾貨」檢測識別二維碼的幾大開源庫彙總

dicksonjyl560101發表於2019-08-11

自從手機APP二維碼支付進入了人們的日常生活後,方便安全,真是無處不在。

特別是1994年日本Denso Wave發明的QR碼(快速響應),它獲得最廣泛應用,因為它易於檢測,寫入大量資訊,並提供強大的錯誤糾正機制,它可以說是第一個最大的影像識別應用程式。


「乾貨」檢測識別二維碼的幾大開源庫彙總


二維碼的檢測和解碼已成為許多應用開發的必要條件。面對許多開源庫,哪一個更好?

我們比較了五個值得參考的有影響力的開源庫中的檢測演算法。

參與開源庫的比較:

BoofCV (Ver. 0.33):一種用Java實現的開源、實時的計算機視覺庫;

OpenCV (Ver. 4.0.1):OpenCV 4.0後加入了QR碼檢測和解碼功能,C++實現;

Quirc (Feb 1, 2018. SHA 307473db):一種專門面向QR碼的檢測和解碼庫,C語言實現;

ZBar (Ver. 0.10):一種被廣泛使用的包含各種條碼檢測識別的專門庫,支援各種平臺,支援Python, Perl, C++等語言;

ZXing (Ver. 3.3.3):一種面向Java Android開發的各種條碼檢測識別庫,用Java開發,支援多種語言;

為了全面比較每個開源庫的效能以檢測QR碼,作者在應用程式中收集了大量常見情況。


「乾貨」檢測識別二維碼的幾大開源庫彙總


各類別包含的影像數:


「乾貨」檢測識別二維碼的幾大開源庫彙總


作者透過將檢測到的位置和標籤位置與10%作為閾值進行匹配來定義檢測成功,並計算真陽性,假陽性,真陰性和假陰性,最後計算F-Measure以比較檢測結果。

按類別劃分的測試結果統計:


「乾貨」檢測識別二維碼的幾大開源庫彙總


不分類別的全域性統計:


「乾貨」檢測識別二維碼的幾大開源庫彙總


可以看出,沒有哪個庫比其他庫更好,但在大多數情況下,BoofCV最好或接近最佳。在大多數類別中,Zbar優於ZXing,但在ZXing最擅長的類別中,Zbar還不夠好。Quirc在正常情況下表現良好,但其他圖書館中表現最佳的類別並不是很好。OpenCV無疑總是最糟糕的。

檢測速度結果比較:


「乾貨」檢測識別二維碼的幾大開源庫彙總


在哪個類別中,效能是一致的,ZXing是最快的庫,其次是BoofCV。OpenCV的速度效能非常穩定且速度最慢。。。

結論:

您選擇哪個庫取決於您的應用程式。如果QR碼比較標準推薦BoofCV,其檢測精度高,速度也很好。如果QR碼髒了或外觀發生變化,ZXing是個不錯的選擇。如果您只能使用C ++,建議使用Zbar。

我們挑一個Zbar來實驗下:

環境:VS2010、OpenCV2.4.9、Zbar環境配置

環境說明:

1. OpenCV是一個機器視覺開源類庫,廣泛用於影像處理、模式識別等領域,它是Zbar專案的核心。這裡我使用的是OpenCV2.4.9。(不建議使用OpenCV1版本)

2. 整合開發工具Visual Studio2010。(不建議使用Visual C++ 6.0,因其僅支援OpenCV1.0的版本),新建C++控制檯應用程式,並設定相應的工程屬性,新增包含目錄、附加連結等。

3. 測試程式如下:



#include "zbar.h"
#include "cv.h"
#include "highgui.h"
#include <iostream>

using namespace std;
using namespace zbar;
using namespace cv;

int main(void)
{
ImageScanner scanner;
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
char file[256];
cin>>file;
Mat img = imread(file,0);
Mat imgout;
cvtColor(img,imgout,CV_GRAY2RGB);
int width = img.cols;
int height = img.rows;
uchar *raw = (uchar *)img.data;
Image image(width, height, "Y800", raw, width * height);
int n = scanner.scan(image);
for(Image::SymbolIterator symbol = image.symbol_begin();symbol != image.symbol_end();symbol++)
{
vector<Point> vp;
cout<<"Decoded:êo"<<endl<<symbol->get_type_name()<<endl<<endl;
cout<<"Symbol:êo"<<endl<<symbol->get_data()<<endl<<endl;
int n = symbol->get_location_size();
for(int i=0;i<n;i++)
{
vp.push_back(Point(symbol->get_location_x(i),symbol->get_location_y(i)));
}
RotatedRect r = minAreaRect(vp);
Point2f pts[4];
r.points(pts);
Point textPoint(pts[1]);
string codeNum=symbol->get_data();
for(int i=0;i<4;i++)
{
line(imgout,pts[i],pts[(i+1)%4],Scalar(255,0,0),3);
textPoint.x>=pts[i].x?textPoint.x=pts[i].x:textPoint.x=textPoint.x;
textPoint.y>=pts[i].y?textPoint.y=pts[i].y:textPoint.y=textPoint.y;
putText(imgout,codeNum,textPoint,FONT_HERSHEY_COMPLEX,1,Scalar(0,0,255),1,8,false);
}
cout<<"Angle: "<<r.angle<<endl;
}
imshow("imgout.jpg",imgout);
waitKey();
}


4. 先生成一個嵌入文字資訊的二維碼


「乾貨」檢測識別二維碼的幾大開源庫彙總



執行測試程式,如下圖:


「乾貨」檢測識別二維碼的幾大開源庫彙總



換個網址再試試:


「乾貨」檢測識別二維碼的幾大開源庫彙總



大家可以自己嘗試下。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2653341/,如需轉載,請註明出處,否則將追究法律責任。

相關文章