呃......很抱歉,检测到您当前浏览器兼容性较差,为了保证您有更高品质的使用体验

1.若当前为360浏览器,请切换至 极速模式

2.若当前为IE浏览器,建议更换为 谷歌浏览器

WeChatCV wechat_qrcode 在线测试

在线测试识别效果

请移步官方下载

Github :opencvopencv_contrib ModulesWeChatCV opencv_3rdparty

优势:与传统Zxing相比,识别前进行图片算法优化,基于开源大作OpenCV,使用CNN训练模型,你可以自己增强训练模型提高识别率

难度:需要了解学习opencv,目前仅提供:Python、C++使用方式

声明:本网站并非腾讯官方网站,只是本人学习时发现微信开源了二维码识别引擎但未发现提供线上测试而无法体验效果,所以完善了一个在线工具以便大家测试。

鸣谢:感谢微信团队的开源方案。


部分测试图片

WeChatCV 测试图片

WeChatCV Python使用教程

命令行:
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()

WeChatCV c++使用教程

#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;
}