之前用打算用Qt+Qzxing调用本地摄像头读取二维码,但是不知道如何获取Qt摄像头的capture的帧,所以只好求助于opencv来完成了,和前面两节基本相同,就是加入Qzxing的程序,很简单。
Qzxing的下地址:https://github.com/ftylitak/qzxing;
下载后是一个源码文件,解压后放置Qt编译程序的debug源文件里就可以,如果在外面还有在pro中添加路径;
下面是源码:
QtOpencvQzxing.pro源码:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = QtOpencvQzxing
TEMPLATE = app
INCLUDEPATH += C:/opencv2.1/include/opencv
LIBS += -LC:/opencv2.1/lib/ -lcv210 -lcvaux210 -lhighgui210 -lcxcore210
#opencv的路径
include(QZXing/QZXing.pri)
#添加路径为相对路径则文件要拷贝到源文件目录里
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
mianwindow.h源码:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "cv.h"
#include "highgui.h"
#include <QTime>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void cameraopen();
//声明函数
private:
Ui::MainWindow *ui;
QTimer *timer;
//QTimer 计时用;
IplImage* pFrame;
//申请IplImage类型指针,就是申请内存空间来存放每一帧图像
CvCapture *cam;
// 视频获取结构, 用来作为视频获取函数的一个参数
};
#endif // MAINWINDOW_H
mianwindow.cpp源码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>
#include "QZXing.h"
//添加Qzxing.h头文件前确定pro文件中已经添加路径
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
timer = new QTimer(this);
//初始化timer
cam = NULL;
// 初始化cam
connect(timer, SIGNAL(timeout()), this, SLOT(cameraopen()));
// 时间到,读取当前摄像头信息,这个必须加,因为timer需要配合timeout()信号用
//没有的话会出现错误;
//另外注意自己有没有野指针,有的话常常会
//出现Program Files (x86)\SogouInput\7.2.0.2124\程序异常终止,这样的错误
}
MainWindow::~MainWindow()
{
delete ui;
cvReleaseCapture(&cam);
//释放内存;
}
void MainWindow::on_pushButton_clicked()
{
cam = cvCreateCameraCapture(0);
//打开摄像头,从摄像头中获取视频
timer->start(33);
// 开始计时,超时则发出timeout()信号
}
void MainWindow::on_pushButton_2_clicked()
{
timer->stop();
// 停止读取数据。
cvReleaseCapture(&cam);
//释放内存;
}
void MainWindow::cameraopen()
{
pFrame = cvQueryFrame(cam);
// 从摄像头中抓取并返回每一帧
QImage image((const uchar*)pFrame->imageData, pFrame->width, pFrame->height,QImage::Format_RGB888);
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
QZXing *pDecoder = new QZXing(QZXing::DecoderFormat_MAXICODE);
//Qzxing对象
QString qrmsg=pDecoder->decodeImage(image);
//decodeImage是Qzxing解码函数,解码出来的是QString字符体
if (!qrmsg.isEmpty())
{
ui->lineEdit->setText(qrmsg);
//将解码出的文本显示在lineEdit上
QGraphicsScene *scene = new QGraphicsScene;
//创建图片显示方式的容器
scene->addPixmap(QPixmap::fromImage(image));
//装载图片
ui->graphicsView->setScene(scene);
//显示图片,自动添加滚动条
ui->graphicsView->show();
//显示图片
timer->stop();
// 停止读取数据。
cvReleaseCapture(&cam);
//释放内存;
}
else
{
ui->lineEdit->setText("未检测到");
//显示解码失败
QGraphicsScene *scene = new QGraphicsScene;
//创建图片显示方式的容器
scene->addPixmap(QPixmap::fromImage(image));
//装载图片
ui->graphicsView->setScene(scene);
//显示图片,自动添加滚动条
ui->graphicsView->show();
//显示图片
}
}
效果图: