基於OpenCV+ZXing手工打造,FPS300+的二維碼識別庫

點擊上方藍字關注我們
微信公眾號:OpenCV學堂
關注獲取更多計算機視覺與深度學習知識
軟件版本信息
Windows10系統
OpenCV4.5.1
VS2017
OpenCV官方支持函數
OpenCV在4.5.1中支持的了微信開源的二維碼識別,通過檢測模型與超像素模型分別實現了檢測與預處理,然后基於ZXing實現了解碼。當前還在擴展模塊中,而且還需要DNN模型加持,模型雖小,但是也費電!好處是三行代碼,調用簡單:
import cv2
detector = cv2.wechat_qrcode_WeChatQRCode("detect.prototxt", "detect.caffemodel", "sr.prototxt", "sr.caffemodel")
image = cv2.imread("weixin.png")
res, points = detector.detectAndDecode(image)
視頻檢測+識別的速度大概FPS 70+左右,有人已經測試過!我看到這個以后的第一感覺就是我有一個更加環保+快速的方案。
他山之石可以攻玉
在我之前傳統的二維碼檢測基礎上,重新整理並優化了流程,使用二值分析方法實現二維碼檢測定位,然后基於ZXing解碼實現了二維碼的檢測與識別。對輸入圖像大小為:
3508x2480的圖像!
檢測+識別平均速度在25毫秒左右!
基於攝像頭的二維碼實時識別,640x480分辨率,檢測+識別速度超過350+FPS,比直接調用OpenCV官方支持函數快5倍!而且支持旋轉、低像素重建、邊緣干擾修復等預處理。不信請看圖:
代碼就不放出來了,好久以前在OpenCV還沒有二維碼檢測函數的時候,我寫過一篇文章,教大家如何基於OpenCV手工寫代碼實現高精准的二維碼檢測。鏈接在這里:
干貨 | 基於OpenCV Python實現二維碼檢測與識別
現在的代碼就是基於當時文章代碼上修改的,然后添加了ZXing庫支持,實現了檢測+識別。可以說速度完全吊打OpenCV官方提供三行代碼!其實我封裝好了函數,調用很簡單,測試代碼如下:
cv::Mat codeROI;
std::vector<cv::Point> pts;
ResultInfo rsinfo;
QRCodeDetector qrdetector;
cv::VideoCapture cap(0);
while (true) {
cap.read(image);
int64 start = cv::getTickCount();
qrdetector.detectQR(image, pts, codeROI);
if (!codeROI.empty()) {
qrdetector.decode(codeROI, rsinfo);
if (rsinfo.status == 0) {
//printf("QR Code Detected! \n");
//printf("QR Code recognized! \n");
//std::cout << rsinfo.code << std::endl;
cv::putText(image, rsinfo.code, pts[0], cv::FONT_HERSHEY_SIMPLEX, 1.0, cv::Scalar(255, 0, 0), 2, 8);
}
}
double ct = (cv::getTickCount() - start) / cv::getTickFrequency();
// printf("execution time : %.5f ms\n", ct * 1000);
cv::putText(image, cv::format("FPS: %.2f", 1.0/ct), cv::Point(50, 50), cv::FONT_HERSHEY_SIMPLEX, 1.0, cv::Scalar(0, 0, 255), 2, 8);
cv::imshow("識別結果", image);
cv::waitKey(1);
}
什么都別說了,點贊,轉發,后續還有故事繼續講......

OpenCV學堂
專注計算機視覺開發技術分享,技術框架使用,包括OpenCV,Tensorflow,Pytorch教程與案例,相關算法詳解,最新CV方向論文,硬核代碼干貨與代碼案例詳解!作者在CV工程化方面深度耕耘15年,感謝您的關注!期待您的一直支持!
公眾號