提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
记录项目的QT和Opencv打开摄像头的学习,学了很多博客的内容,终于完成了
提示:以下是本篇文章正文内容,下面案例可供参考
一、opencv打开摄像头
这里是电脑摄像头,可以先进行测试:
this->vid.open(0);
this->refresh_timer=new QTimer(this);
在.h中定义cv::VideoCapture vid;打开摄像头就可以了
二、图像转换
1.img.h文件设置
代码如下:
#ifndef IMG_H
#define IMG_H
#include <opencv2/opencv.hpp>
#include<QImage>
namespace img {
QImage cvmat_to_qimage(const cv::Mat &mat );
}
#endif // IMG_H
2.img.c 文件设置
代码如下:
#include <img.h>
namespace img
{
QImage cvmat_to_qimage(const cv::Mat &mat )
{
switch (mat.type())
{
case CV_8UC1:
{
QImage image(mat.data, mat.cols, mat.rows, mat.cols, QImage::Format_Grayscale8);
return image;
}
case CV_8UC3:
{
QImage image(mat.data, mat.cols, mat.rows, mat.cols * 3, QImage::Format_RGB888);
return image.rgbSwapped();
}
case CV_8UC4:
{
QImage image(mat.data, mat.cols, mat.rows, mat.cols * 4, QImage::Format_ARGB32);
return image;
}
default:
{
return QImage();
}
}
}
}
根据图像格式进行相应转换
3. 主窗口文件设置
mainwindow1.cpp
#include "mainwindow1.h"
#include "ui_mainwindow1.h"
#include <img.h>
MainWindow1::MainWindow1(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow1)
{
ui->setupUi(this);
this->vid.open(0);
this->refresh_timer=new QTimer(this);
connect(this->refresh_timer, SIGNAL(timeout()), this,SLOT(refresh_timer1()));
this->refresh_timer->start(33);
}
MainWindow1::~MainWindow1()
{
delete ui;
}
void MainWindow1::refresh_timer1()
{
cv::Mat frame;
this->vid >>frame;
//cv::imshow ("frame",frame);
//cv::waitKey(1);
QImage image=img::cvmat_to_qimage(frame);
this->ui->label1->setPixmap(QPixmap::fromImage(image));
}
mainwindow1.h
#ifndef MAINWINDOW1_H
#define MAINWINDOW1_H
#include <QMainWindow>
#include <opencv2/opencv.hpp>
#include <qtimer.h>
namespace Ui {
class MainWindow1;
}
class MainWindow1 : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow1(QWidget *parent = nullptr);
~MainWindow1();
private:
Ui::MainWindow1 *ui;
cv::VideoCapture vid;
QTimer *refresh_timer;
public slots:
void refresh_timer1();
};
#endif // MAINWINDOW1_H
注意
this->ui->label1->setPixmap(QPixmap::fromImage(image));
label1是自己在界面里起名的;
connectSlotsByName: No matching signal for on__refresh_timer()的问题在于利用VS关联的问题,去掉on即可。
还有就是一定要注意格式,字母,错了很难发现
总结
学习的视频:【在Qt项目中调用OpenCV: 访问usb摄像头并实时绘制到QLabel (CMake + VSCode)】 https://www.bilibili.com/video/BV1T44y157si/?share_source=copy_web&vd_source=718510cf29111f9fba7b8783215d23f4
用qmake也是可以的
报错的:http://t.csdnimg.cn/Pu7qI