首先参考链接如下: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);