QT笔记 3 摄像头操作 opencv3.3

在工程目录下添加opencv3.3的库

在空白位置,点击右键,选择在终端中打开

输入ls -name 然后回车

选择,然后点击右键复制

在.pro文件中粘贴,

添加库路径     (注意:后面我会给出代码,直接复制就行)

将 lib 的开头全部改为 -l

.dll 后缀改为 空格+\       (注意:后面我会给出代码,直接复制就行)

INCLUDEPATH += $$PWD/opencv3.3/include
LIBS += -L$$PWD/opencv3.3/lib \
    -lopencv_calib3d330 \
    -lopencv_core330 \
    -lopencv_dnn330 \
    -lopencv_features2d330 \
    -lopencv_flann330 \
    -lopencv_highgui330 \
    -lopencv_imgcodecs330 \
    -lopencv_imgproc330 \
    -lopencv_ml330 \
    -lopencv_objdetect330 \
    -lopencv_photo330 \
    -lopencv_shape330 \
    -lopencv_stitching330 \
    -lopencv_superres330 \
    -lopencv_video330 \
    -lopencv_videoio330 \
    -lopencv_videostab330

添加新文件,作为摄像头的线程

打开新创建的.h文件修改

#ifndef CAMERATHREAD_H
#define CAMERATHREAD_H

#include <QObject>
#include <QtCore>
#include <QImage>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;//引用命名空间

class CameraThread : public QThread
{
    Q_OBJECT
public:
    explicit CameraThread(QObject *parent = nullptr);
    ~CameraThread();

    bool getIs_run() const;
    void setIs_run(bool value);
    QImage cvMat2Qimage(const Mat &src);
    void slotCamerImage(QImage &);

signals:
    void sigNewImage(QImage);

protected:
    void run(void); //重写方法

private:
    bool is_run; //控制条件
    VideoCapture *camera;

};

#endif // CAMERATHREAD_HQ

修改.cpp

#include "camerathread.h"
#include <QDebug>

CameraThread::CameraThread(QObject *parent) : QThread(parent)
{
    is_run = true;

    //打开摄像头
    int ret;
    int wide = 640;
    int high = 480;
    camera = new VideoCapture;
    ret = camera->open(0);
    ret &= camera->set(CV_CAP_PROP_FRAME_WIDTH, wide);
    ret &= camera->set(CV_CAP_PROP_FRAME_HEIGHT, high);
    if(!ret) { //打开失败
        qDebug("open camera error");
    }

}

CameraThread::~CameraThread()
{
    delete camera;
}

bool CameraThread::getIs_run() const
{
    return is_run;
}

void CameraThread::setIs_run(bool value)
{
    is_run = value;
}

QImage CameraThread::cvMat2Qimage(const Mat &src)
{
    //CV_8UC1 8位无符号的单通道---灰度图片
    if(src.type() == CV_8UC3){
        //得到图像的首地址
        const uchar *pSrc = (const uchar*)src.data;
        //以src构造图片
        QImage qImage(pSrc, src.cols, src.rows, src.step, QImage::Format_RGB888);
        //在不改变实际图像数据的条件下,交换红蓝通道
        return qImage.rgbSwapped();
    }else{
        return QImage();
    }
}

void CameraThread::slotCamerImage(QImage &image)
{
    Mat mat; // 图像对象
    camera->read(mat); //读取摄像头图像数据
    image = cvMat2Qimage(mat); //转换成QImage
}

void CameraThread::run()
{
    Mat mat; // 图像对象
    QImage image;

    while (is_run) {
        camera->read(mat); //读取摄像头图像数据
        if (mat.empty()) { //判断是否是空
            continue;
        }
        image = cvMat2Qimage(mat); //转换成QImage
        emit sigNewImage(image);  //通过信号发射出去
        msleep(33); //摄像头帧率为30帧,一秒只会输出30张图片
    }
}

在哪显示摄像头画面就在哪添加

.h

#ifndef REGISTERPAGE_H
#define REGISTERPAGE_H

#include <QWidget>
#include <QMovie>

#include "camerathread.h"

namespace Ui {
class RegisterPage;
}

class RegisterPage : public QWidget
{
    Q_OBJECT

public:
    explicit RegisterPage(QWidget *parent = 0);
    ~RegisterPage();
    void getImage(QImage);

private slots:
    void slotCamerImage(QImage);

    void on_pushButton_clicked();//点击拍照

private:
    Ui::RegisterPage *ui;

    QMovie *movie;
    CameraThread *camerathread;
};

#endif // REGISTERPAGE_H

图像在Lable中显示

.cpp

#include "registerpage.h"
#include "ui_registerpage.h"

RegisterPage::RegisterPage(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::RegisterPage)
{
    ui->setupUi(this);

//    movie = new QMovie(":/PNG/men.gif");
//    movie->setScaledSize(ui->labelGIF->size());
//    ui->labelGIF->setMovie(movie);
//    movie->start();

    camerathread = new CameraThread(this);
    connect(camerathread, &CameraThread::sigNewImage, this, &RegisterPage::slotCamerImage);
    camerathread->start();


}

RegisterPage::~RegisterPage()
{
    camerathread->setIs_run(false);
    camerathread->quit();
    camerathread->wait();
    delete camerathread;

    delete ui;
}


void RegisterPage::slotCamerImage(QImage image)
{
    QPixmap pix = QPixmap::fromImage(image);
    ui->labelCamera->setPixmap(pix.scaled(ui->labelCamera->size()));
}

void RegisterPage::on_pushButton_clicked()
{
    QImage image;
    camerathread->slotCamerImage(image);
    QPixmap pix = QPixmap::fromImage(image);
    ui->label_2->setPixmap(pix.scaled(ui->label_2->size()));

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值