联合OpenCV4.5.2利用微信开源的库识别二维码

首先参考链接如下:https://mp.weixin.qq.com/s/2GZAJAUPHTXFOKDRv-D21Q

有以下问题:

(1)只有opencv_contrib4.5.2及其以上版本的modeule中才有wechat_qrcode,注意按照上述链接中4.5.1的版本是没有的哟!

(2)利用cmake去编译contribu库时,需要注意,不要勾选python,不然后面生成项目时,会报错的。

我的使用版本是:opencv4.5.2,opencv_contrib4.5.2,VS2017;(debug+x64位)

这里是我编译好的文件,请自取:

https://download.youkuaiyun.com/download/Helloorld_1/87446941

核心模块文件下载地址:

https://github.com/WeChatCV/opencv_3rdparty

以下是用来测试的代码:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/wechat_qrcode.hpp>

using namespace std;
using namespace cv;

int main()
{
	//加载图片解码
	Ptr<wechat_qrcode::WeChatQRCode> detector;
	string detect_prototxt = "./model/detect.prototxt";//修改下载的核心文件位置
	string detect_caffe_model = "./model/detect.caffemodel";
	string sr_prototxt = "./model/sr.prototxt";
	string sr_caffe_model = "./model/sr.caffemodel";

	Mat img = imread("QR.jpg");//选择识别含有二维码的图片
	try//用来抛出异常的代码,检查是否能使用核心文件。
	{
		detector = makePtr<wechat_qrcode::WeChatQRCode>(detect_prototxt, detect_caffe_model,
			sr_prototxt, sr_caffe_model);
	}
	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;
	}

	vector<Mat> vPoints;
	vector<String> strDecoded;
	strDecoded = detector->detectAndDecode(img, vPoints);//检测二维码,并返回结果,用Vpoints来保存边框信息。
	for (int i = 0; i < strDecoded.size(); i++)
	{
		cout << "decode-" << i + 1 << ": " << strDecoded[i] << endl;
		Point pt1 = Point((int)vPoints[i].at<float>(0, 0), (int)vPoints[i].at<float>(0, 1));
		Point pt2 = Point((int)vPoints[i].at<float>(1, 0), (int)vPoints[i].at<float>(1, 1));
		Point pt3 = Point((int)vPoints[i].at<float>(2, 0), (int)vPoints[i].at<float>(2, 1));
		Point pt4 = Point((int)vPoints[i].at<float>(3, 0), (int)vPoints[i].at<float>(3, 1));
		line(img, pt1, pt2, Scalar(0, 255, 0), 2);
		line(img, pt2, pt3, Scalar(0, 255, 0), 2);
		line(img, pt3, pt4, Scalar(0, 255, 0), 2);
		line(img, pt4, pt1, Scalar(0, 255, 0), 2);
		putText(img, strDecoded[i], pt1, 0, 0.5, Scalar(255, 0, 0), 2);
	}
	imshow("wechat_qrcode", img);
	waitKey();
	//imwrite("result.png", img);
}

**************************************************************************************************************

在这里简单的介绍一哈如何用QT和opencv来实现二维码识别:

首先,需要下载并安装QT和OpenCV,以及配置它们的环境变量。可以参考这篇教程1,它详细
介绍了在Windows下如何搭建QT和OpencV的开发环境。
然后,需要在QT中创建一个新的项目,选择QtWidgetsApplication模板,并设置项目的名称和路
径。
接着,需要在项自的.pro文件中添加OpencV的头文件和库文件的路径,以便QT能够找到并链接
OpenCV。您可以参考这篇教程,它举例了如何在.pro文件中添加opencV的相关路径。
然后,您需要在项自的主窗口类中添加一些控件和变量,用于显示摄像头的图像和检测到的人脸。如何在QT中使用QLabel、QPushButton、QTimer等控件,并定义了一些OpencV相关的变量。

接着,您需要在项自的主窗口类中实现一些槽函数,用于处理摄像头的数据、调用OpencV的人脸检测函数、更新界面等。可以使用Qlmage等类来获取和转换摄像头的数据。

最后,您需要在项目的主函数中创建并显示主窗口对象,并运行应用程序。它给出了一个简单的主函数的代码。

// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QPushButton>
#include <QTimer>
#include <QCamera>
#include <QCameraInfo>
#include <QCameraImageCapture>
#include <opencv2/opencv.hpp>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_start_clicked();
    void on_pushButton_stop_clicked();
    void on_pushButton_capture_clicked();
    void processFrame();

private:
    Ui::MainWindow *ui;
    QCamera *camera; // 用于获取摄像头
    QCameraImageCapture *imageCapture; // 用于捕获图像
    QTimer *timer; // 用于定时处理帧
    cv::Mat frame; // 用于存储当前帧
    cv::CascadeClassifier faceCascade; // 用于人脸检测
};

#endif // MAINWINDOW_H

        在这里,有一些小的建议,在使用摄像头的时候,可以考虑添加自选摄像头参数(QCamera),还有添加聚焦等功能,另外最好将摄像头显示画面这个功能放到子线程里面,这样会带来几个好处,首先是不会堵塞主线程,也就是说在显示画面的同时,你还可以进行其他的任务处理,包括截图,选择模式等等。另外除了可以识别二维码,也可以生成二维码,生成二维码也可以利用开源的第三方代码仓库,qrcodegen.hpp来实现。

使用qrencode库步骤:
1.在QtCreator中创建一个新的QtWidgets应用程序工程。
2.下载并安装qrencode库。
3.在项目的.pro文件中添加qrencode的头文件和库文件的路径。
4.在Qt应用程序中包含qrencode头文件:#include"qrencode.h"
5.创建一个QRcode对象,并使用QRcode_encodeStringO函数将您想要存储的数据编码为二维码结构体:QRcode*qr=QRcode_encodeString("yourdata",2,QR_ECLEVEL_L,QR_MODE_8,O);
6.创建一个QImage对象,并使用QRcode结构体中的数据来绘制二维码图像:QImageimage(width,height,QImage::Format_Mono);QPainterpainter(&image);.
7.将Qlmage对象转换为QPixmap对象,并显示在一个QLabel控件上:QPixmappixmap=
QPixmap::fromImage(image);ui->label->setPixmap(pixmap);

生成二维码代码参考如下:

 const char *text;
    if(despoitory!="")
    {
        text = (ui->plainTextEdit->toPlainText()+"\n"+"储位:"+"\n"+despoitory).toLocal8Bit();
    }
    else
    {
     text = (ui->plainTextEdit->toPlainText()).toLocal8Bit();              // User-supplied text
    }
    const qrcodegen::QrCode::Ecc errCorLvl =  qrcodegen::QrCode::Ecc::LOW;  // Error correction level

        // Make and print the QR Code symbol
        const  qrcodegen::QrCode qr =  qrcodegen::QrCode::encodeText(text, errCorLvl);
    //    printQr(qr);

        QImage QrCode_Image=QImage(qr.getSize(),qr.getSize(),QImage::Format_RGB888);
        for (int y = 0; y < qr.getSize(); y++) {
            for (int x =0; x < qr.getSize(); x++) {
                if(qr.getModule(x, y)==0){
                    QrCode_Image.setPixel(x,y,qRgb(255,255,255));
                }else{
                    QrCode_Image.setPixel(x,y,qRgb(0,0,0));
                }
            }
        }
        //图像大小转换为适当的大小
//            QrCode_Image=QrCode_Image.scaled(ui->label_4->width(),ui->label_4->height(),
//                            Qt::KeepAspectRatio);
            QrCode_Image=QrCode_Image.scaled(200,200,Qt::KeepAspectRatio);//374
            //转换为QPixmap在Label中显示
            ui->label_4->setPixmap(QPixmap::fromImage(QrCode_Image).scaled(ui->label_4->width(), ui->label_4->height(),Qt::KeepAspectRatio));
//            const QPixmap *current_img = ui->label_4->pixmap();
            const QPixmap current_img=QPixmap::fromImage(QrCode_Image) ;
            QString dir="QR.jpg";
            current_img.save(dir);

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Helloorld_11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值