请移步官方下载
Github :opencv 、opencv_contrib Modules 、WeChatCV opencv_3rdparty
优势:与传统Zxing相比,识别前进行图片算法优化,基于开源大作OpenCV,使用CNN训练模型,你可以自己增强训练模型提高识别率
难度:需要了解学习opencv,目前仅提供:Python、C++使用方式
声明:本网站并非腾讯官方网站,只是本人学习时发现微信开源了二维码识别引擎但未发现提供线上测试而无法体验效果,所以完善了一个在线工具以便大家测试。
鸣谢:感谢微信团队的开源方案。
部分测试图片
命令行: python qrcode.py /root/test_qr.png qrcode.py 源码: import cv2 import sys print(sys.argv[0]) print('A demo program of WeChat QRCode Detector:') camIdx = -1 if len(sys.argv) > 1: if sys.argv[1] == "-camera": camIdx = int(sys.argv[2]) if len(sys.argv)>2 else 0 img = cv2.imread(sys.argv[1]) else: print(" Usage: " + sys.argv[0] + "") exit(0) # For python API generator, it follows the template: {module_name}_{class_name}, # so it is a little weird. # The model is downloaded to ${CMAKE_BINARY_DIR}/downloads/wechat_qrcode if cmake runs without warnings, # otherwise you can download them from https://github.com/WeChatCV/opencv_3rdparty/tree/wechat_qrcode. try: detector = cv2.wechat_qrcode_WeChatQRCode( "detect.prototxt", "detect.caffemodel", "sr.prototxt", "sr.caffemodel") except: print("---------------------------------------------------------------") print("Failed to initialize WeChatQRCode.") print("Please, download 'detector.*' and 'sr.*' from") print("https://github.com/WeChatCV/opencv_3rdparty/tree/wechat_qrcode") print("and put them into the current directory.") print("---------------------------------------------------------------") exit(0) prevstr = "" if camIdx < 0: res, points = detector.detectAndDecode(img) print(res) else: cap = cv2.VideoCapture(camIdx) while True: res, img = cap.read() if img.empty(): break res, points = detector.detectAndDecode(img) for t in res: if t != prevstr: print(t) if res: prevstr = res[-1] cv2.imshow("image", img) if cv2.waitKey(30) >= 0: break # When everything done, release the capture cap.release() cv2.destroyAllWindows()
#include <iostream> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> using namespace std; using namespace cv; #include <opencv2/wechat_qrcode.hpp> int main(int argc, char* argv[]) { cout << endl << argv[0] << endl << endl; cout << "A demo program of WeChat QRCode Detector: " << endl; Mat img; int camIdx = -1; if (argc > 1) { bool live = strcmp(argv[1], "-camera") == 0; if (live) { camIdx = argc > 2 ? atoi(argv[2]) : 0; } else { img = imread(argv[1]); } } else { cout << " Usage: " << argv[0] << " <input_image>" << endl; return 0; } // The model is downloaded to ${CMAKE_BINARY_DIR}/downloads/wechat_qrcode if cmake runs without warnings, // otherwise you can download them from https://github.com/WeChatCV/opencv_3rdparty/tree/wechat_qrcode. Ptr<wechat_qrcode::WeChatQRCode> detector; try { detector = makePtr<wechat_qrcode::WeChatQRCode>("detect.prototxt", "detect.caffemodel", "sr.prototxt", "sr.caffemodel"); } catch (const std::exception& e) { cout << "\n---------------------------------------------------------------\n" "Failed to initialize WeChatQRCode.\n" "Please, download 'detector.*' and 'sr.*' from\n" "https://github.com/WeChatCV/opencv_3rdparty/tree/wechat_qrcode\n" "and put them into the current directory.\n" "---------------------------------------------------------------\n"; cout << e.what() << endl; return 0; } string prevstr = ""; vector<Mat> points; if (camIdx < 0) { auto res = detector->detectAndDecode(img, points); for (const auto& t : res) cout << t << endl; } else { VideoCapture cap(camIdx); for(;;) { cap >> img; if (img.empty()) break; auto res = detector->detectAndDecode(img, points); for (const auto& t : res) { if (t != prevstr) cout << t << endl; } if (!res.empty()) prevstr = res.back(); imshow("image", img); if (waitKey(30) >= 0) break; } } return 0; }