「乾貨」檢測識別二維碼的幾大開源庫彙總
自從手機APP二維碼支付進入了人們的日常生活後,方便安全,真是無處不在。
特別是1994年日本Denso Wave發明的QR碼(快速響應),它獲得最廣泛應用,因為它易於檢測,寫入大量資訊,並提供強大的錯誤糾正機制,它可以說是第一個最大的影象識別應用程式。
二維碼的檢測和解碼已成為許多應用開發的必要條件。面對許多開源庫,哪一個更好?
我們比較了五個值得參考的有影響力的開源庫中的檢測演算法。
參與開源庫的比較:
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碼,作者在應用程式中收集了大量常見情況。
各類別包含的影象數:
作者通過將檢測到的位置和標籤位置與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. 先生成一個嵌入文字資訊的二維碼
執行測試程式,如下圖:
換個網址再試試:
大家可以自己嘗試下。
https://www.toutiao.com/a6723706799859433995/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2653341/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 前端開發 JavaScript 乾貨知識點彙總前端JavaScript
- 人臉識別相關開源專案彙總
- Flutter - 生成二維碼與識別二維碼Flutter
- halcon識別二維碼
- 目標檢測:二維碼檢測方案
- 文字檢測與識別資源
- Android常用開源庫整理彙總Android
- 【乾貨】驗證碼的常見型別總結型別
- 揭開二維碼背後的神秘面紗用二維碼識別 API 就夠了API
- iOS 二維碼生成以及識別iOS
- 【介面乾貨】好用、免費api彙總API
- ES6面試、複習乾貨知識點彙總(全)面試
- 鴻蒙NEXT開發案例:二維碼的生成與識別鴻蒙
- 人臉檢測識別,人臉檢測,人臉識別,離線檢測,C#原始碼C#原始碼
- 【大總結2】大學兩年,寫了這篇幾十萬字的乾貨總結
- PHP、Python、JavaScript 識別二維碼和生成二維碼解決方案PHPPythonJavaScript
- 人工智慧大模型之開源大語言模型彙總(國內外開源專案模型彙總)人工智慧大模型
- 大學兩年,寫了這篇幾十萬字的乾貨總結
- 純web端實現二維碼識別Web
- 最全面的vue開源專案庫彙總Vue
- 乾貨來了:Chrome常用快捷鍵整理彙總Chrome
- Java知識彙總——思維導圖Java
- python+opencv檢測圖片中二維碼PythonOpenCV
- yolov5實戰之二維碼檢測YOLO
- 開源RAG框架彙總框架
- 二維碼知識
- 【乾貨分享】常用的八個Linux作業系統彙總!Linux作業系統
- 技術乾貨:Kotlin面試題彙總及答案Kotlin面試題
- 乾貨 | 超全面的檔案傳輸方式彙總
- 技術乾貨:Tomcat面試題彙總及答案Tomcat面試題
- 技術乾貨:Kubernetes面試題彙總及答案面試題
- 用OpenCV和Python識別二維碼和條形碼OpenCVPython
- 好程式設計師web前端乾貨之web前端開發框架彙總程式設計師Web前端框架
- C++知識點大彙總C++
- 小程式–關於小程式未上線二維碼識別功能開發
- 技術乾貨:spring cloud面試題彙總及答案SpringCloud面試題
- APP下載頁二維碼支援識別微信APP
- 網頁長按儲存及識別二維碼網頁