在工程目录下添加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()));
}