Qt5:opencv摄像头播放视频

 

完整代码 


GitHub下载:Qt+opencv摄像头播放视频
CSDN下载:https://download.csdn.net/download/mars_xiaolei/11015580

 

前期准备


我们的目的是将摄像头采集到的视频显示在Qt界面窗口上,而不是imshow到OpenCV自己的窗口上。在编写代码之前,需要先在Qt上配置OpenCV,如果没有配置,请先把OpenCV配置好;如果已配置,直接跳过。

Qt上配置OpenCV链接:https://blog.csdn.net/mars_xiaolei/article/details/83246358

 

OpenCV播放视频简单示例


1、打开Qt,新建一个Qt Widgets Application项目,添加1个label控件和2个pushButton按钮,修改pushButton按钮的名字为“开始”和“停止”,控件对象名未进行修改。

2、由于使用到了OpenCV,因此需要在pro项目配置文件里添加OpenCV的附加头文件包含路径,根据自己配置的OpenCV进行修改,大致内容如下:

# 附加头文件包含,一般要编译链接第三方库时配置include目录
# 注意:1、可以用绝对路径或相对路径 2、相对路径中的./可以省略 3、路径中不允许出现空格
INCLUDEPATH += D:/OpenCV342/opencv/build/include

LIBS += D:\OpenCV342\QtOpenCV\install\x86\mingw\lib\libopencv_*.a

3、接下来要添加“信号槽”,分别选中两个push button,右键选择转到槽...,然后选择clicked(),系统会自动创建控件单击响应函数。

4、也可以手动进行添加 “信号槽”,一共需要三步:(1)头问价添加slots槽函数声明(2)源文件添加槽函数定义(3)源文件添加信号槽连接,大致内容如下:

//槽函数声明
private slots:
    void ReadFrame();
    void OpenCameraClicked();
    void CloseCameraClicked();
void MainWindow::ReadFrame()
{
    //获取图像帧
    capture>>frame;
    /*
    //将抓取到的帧,转换为QImage格式,QImage::Format_RGB888使用24位RGB格式(8-8-8)存储图像
    //此时没有使用rgbSwapped()交换所有像素的红色和蓝色分量的值,底色偏蓝
    QImage image = QImage((const uchar*)frame.data,frame.cols, frame.rows,QImage::Format_RGB888);
    //将图片显示到label上
    ui->label->setPixmap(QPixmap::fromImage(image));
    */

    //将视频显示到label上
    QImage image = QImage((const uchar*)frame.data,frame.cols,frame.rows,QImage::Format_RGB888).rgbSwapped();
    ui->label->setPixmap(QPixmap::fromImage(image));
}

//打开摄像头
void MainWindow::OpenCameraClicked()
{
    capture.open(0);//打开摄像头
    timer->start(25);//开启定时器,一次25ms
}

//关闭摄像头
void MainWindow::CloseCameraClicked()
{
    timer->stop();//关闭定时器
    capture.release();//释放图像
}
connect(timer,SIGNAL(timeout()),this,SLOT(ReadFrame()));
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(OpenCameraClicked()));//打开摄像头
connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(CloseCameraClicked()));//打开摄像头

5、下面分别是pro文件、mainwindow.h、mainwindow.cpp的代码

pro文件

#-------------------------------------------------
#
# Project created by QtCreator 2019-03-12T15:46:40
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = PlayVideoTest
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        mainwindow.cpp

HEADERS += \
        mainwindow.h

FORMS += \
        mainwindow.ui

# 附加头文件包含,一般要编译链接第三方库时配置include目录
# 注意:1、可以用绝对路径或相对路径 2、相对路径中的./可以省略 3、路径中不允许出现空格
INCLUDEPATH += D:/OpenCV342/opencv/build/include

LIBS += D:\OpenCV342\QtOpenCV\install\x86\mingw\lib\libopencv_*.a

 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "QTimer"
#include "QImage"
#include "opencv2/opencv.hpp"

using namespace cv;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void ReadFrame();
    void OpenCameraClicked();
    void CloseCameraClicked();
private:
    Ui::MainWindow *ui;
    VideoCapture capture;
    QTimer *timer;
    Mat frame;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle("视频播放简单示例");
    timer=new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(ReadFrame()));
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(OpenCameraClicked()));//打开摄像头
    connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(CloseCameraClicked()));//打开摄像头
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::ReadFrame()
{
    //获取图像帧
    capture>>frame;
    /*
    //将抓取到的帧,转换为QImage格式,QImage::Format_RGB888使用24位RGB格式(8-8-8)存储图像
    //此时没有使用rgbSwapped()交换所有像素的红色和蓝色分量的值,底色偏蓝
    QImage image = QImage((const uchar*)frame.data,frame.cols, frame.rows,QImage::Format_RGB888);
    //将图片显示到label上
    ui->label->setPixmap(QPixmap::fromImage(image));
    */

    //将视频显示到label上
    QImage image = QImage((const uchar*)frame.data,frame.cols,frame.rows,QImage::Format_RGB888).rgbSwapped();
    ui->label->setPixmap(QPixmap::fromImage(image));
}

//打开摄像头
void MainWindow::OpenCameraClicked()
{
    capture.open(0);//打开摄像头
    timer->start(25);//开启定时器,一次25ms
}

//关闭摄像头
void MainWindow::CloseCameraClicked()
{
    timer->stop();//关闭定时器
    capture.release();//释放图像
}

 

显示结果


 

  • 6
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Qt是一个跨平台的C++图形用户界面开发框架,支持许多操作系统,如Windows,MacOS和Linux等。而OpenCV是一个开源计算机视觉库,其中包含许多已实现的图像处理和计算机视觉算法。 读取海康威视摄像头的过程,需要通过海康SDK来实现摄像头的连接以及视频流的采集。要在Qt中使用OpenCV读取海康威视摄像头,需要先将海康SDK和OpenCV的库文件导入到Qt项目中。 首先,需要在Qt项目中添加对OpenCV库的支持,以使Qt能够使用它的函数和类。在添加完OpenCV头文件和库文件之后,就可以考虑以编程方式读取海康威视摄像头。 其次需要在Qt中使用海康SDK提供的API实现海康威视摄像头的连接和视频流的捕捉。打开SDK的开发文档,了解API的使用方法,包括参数列表、函数返回值的处理、错误处理等。编写相应的代码后,就要考虑如何在Qt中处理视频流的各帧图像。 在使用OpenCV的过程中,可以使用cv::Mat类型来存储帧图像,通过cv::VideoCapture类来操作视频流,如读取单帧、播放流等等。同时,对于读取的帧图像,可以使用OpenCV中提供的各种函数和类进行处理和分析。 最后,需要注意的是,在读取海康威视摄像头的过程中,要注意和SDK和OpenCV之间的数据类型和格式的转换,确保数据能够正确地传递和处理。同时还需要注意内存使用和视频流的帧率等性能问题,以保证程序的稳定性和流畅性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值