「乾貨」檢測識別二維碼的幾大開源庫彙總
自從手機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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 前端開發 JavaScript 乾貨知識點彙總前端JavaScript
- Java開源軟體測試工具大彙總Java
- 人臉識別相關開源專案彙總
- Flutter - 生成二維碼與識別二維碼Flutter
- 目標檢測:二維碼檢測方案
- C#開源資源大彙總C#
- iOS 花式二維碼生成和二維碼識別iOS
- iOS開發中識別圖中的二維碼iOS
- ES6面試、複習乾貨知識點彙總(全)面試
- halcon識別二維碼
- 文字檢測與識別資源
- 【介面乾貨】好用、免費api彙總API
- 【乾貨】驗證碼的常見型別總結型別
- 揭開二維碼背後的神秘面紗用二維碼識別 API 就夠了API
- iOS 二維碼生成以及識別iOS
- 影象中二維碼的檢測和定位
- Android常用開源庫整理彙總Android
- Android開源專案庫彙總Android
- Web測試乾貨總結Web
- Spring Boot乾貨系列:(十)開發常用的熱部署方式彙總Spring Boot熱部署
- 人工智慧大模型之開源大語言模型彙總(國內外開源專案模型彙總)人工智慧大模型
- 人臉檢測識別,人臉檢測,人臉識別,離線檢測,C#原始碼C#原始碼
- 【大總結2】大學兩年,寫了這篇幾十萬字的乾貨總結
- 重磅 | 微信小程式開放長按識別二維碼微信小程式
- ios 原生sdk 識別圖片中的二維碼iOS
- 乾貨來了:Chrome常用快捷鍵整理彙總Chrome
- Linux運維領域的開源工具體系彙總Linux運維開源工具
- PHP、Python、JavaScript 識別二維碼和生成二維碼解決方案PHPPythonJavaScript
- 軟體測試工具之開源測試工具彙總
- 純web端實現二維碼識別Web
- QRCode-二維碼識別與生成
- C++用zxing識別二維碼C++
- go大會資源彙總Go
- 用zxing 識別二維碼的main函式AI函式
- Linux以外的開源作業系統大彙總Linux作業系統
- 乾貨 | 超全面的檔案傳輸方式彙總
- 技術乾貨:Tomcat面試題彙總及答案Tomcat面試題
- 技術乾貨:Kotlin面試題彙總及答案Kotlin面試題