【opencv学习之六】opencv+Qt+Qzxing调取本地摄像头识别二维码

之前用打算用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();
        //显示图片
    }
}

效果图:

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值