QT5和Opencv打开摄像头电脑

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

记录项目的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

在Linux操作系统下,我们可以使用QtOpenCV库来打开摄像头Qt提供了一个图形界面框架,而OpenCV则提供了一个计算机视觉框架,两者结合可以方便地实现打开摄像头的操作。 首先,在Qt中可以使用QCamera类来调用摄像头。我们需要在Qt项目中添加multimedia模块,然后使用如下代码来打开摄像头: ``` QCamera *camera = new QCamera; QCameraViewfinder *viewfinder = new QCameraViewfinder; camera->setViewfinder(viewfinder); viewfinder->show(); camera->start(); ``` 这段代码会创建一个QCamera对象,然后将其连接到QCameraViewfinder对象上,最后启动摄像头。 接下来,在OpenCV中我们可以使用VideoCapture类来读取摄像头的数据。我们需要在OpenCV项目中添加opencv_videoio模块,然后使用如下代码来打开摄像头: ``` VideoCapture cap(0); if(cap.isOpened()){ namedWindow("camera", CV_WINDOW_AUTOSIZE); while(true){ Mat frame; cap >> frame; imshow("camera", frame); if(waitKey(30) >= 0) break; } } ``` 这段代码会创建一个VideoCapture对象并将其连接到ID为0的摄像头上,然后进入一个循环读取并显示图像的过程。我们可以使用imshow函数来将每一帧数据呈现在窗口中,waitKey函数用于等待一段时间以等待用户输入。 将QtOpenCV结合起来,可以使用QImage将OpenCV的Mat对象转换为Qt的图像对象,然后在Qt界面中显示。具体实现可以参考Qt+OpenCV官方文档或者网络上的相关教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值