qt+opencv显示当前相机的视频流

文章详细描述了一个使用Qt和OpenCV库开发的QTvision类,展示了如何在C++程序中创建一个窗口,实现实时视频捕获、帧处理和显示,以及控制播放、暂停等功能。
摘要由CSDN通过智能技术生成

main.cpp

#include "QTvision.h"
#include <QtWidgets/QApplication>


int main(int argc, char *argv[])
{
	QApplication a(argc, argv);

	QTvision w;
	w.show();
	//w.setWindowTitle("running");
	return a.exec();
}

QTvision.cpp

#include "QTvision.h"
#include "ui_QTvision.h"

QTvision::QTvision(QWidget *parent)
    : QWidget(parent)
{

	
	ui.setupUi(this);

	timer = new QTimer(this);												
	connect(timer, SIGNAL(timeout()), this, SLOT(importFrame()));        //连接定时器 timer 的 timeout() 信号与当前对象 this 的 importFrame() 槽函数

}

void QTvision::on_comboBox_currentIndexChanged()      //whether the camera import or not
{
	
	if (ui.comboBox->currentIndex())					//  currentIndex是QComboBox 中的一个成员函数,用于获取当前选中项的索引 
		isCamera = 1;									//开启摄像头的
	else
		isCamera = 0;
}

void QTvision::importFrame()
{


	//int width = 3000;
	//int height = 1800;												//因为分辨率调高了很多,所以帧率会降低很多
	//capture.set(cv::CAP_PROP_FRAME_WIDTH, width);						//调整capture相机的分辨率
	//capture.set(cv::CAP_PROP_FRAME_HEIGHT, height);


	capture >> frame;													//从视频源获取一帧,并存到frame里

	 
	//------------相机的话亮度高点,视频的话不操作
	if (isCamera == 1)												//
	{
		frame.convertTo(frame, -1, 5, 0);						// 将亮度增加 3000%(可以根据需要调整参数)
	}else {}

	cvtColor(frame, frame, CV_BGR2RGB);//only RGB of Qt					//将从 capture 获取到的图像数据从 BGR 格式(mat)转换为 RGB 格式(qt)
	QImage srcQImage = QImage((uchar*)(frame.data), frame.cols, frame.rows, QImage::Format_RGB888);//将转换后的 RGB 图像数据创建为 Qt 的 QImage 对象 srcQImage。其中 (uchar*)(frame.data) 是将帧数据的指针转换为 uchar* 类型,用作 QImage 的数据源。

	ui.label->setPixmap(QPixmap::fromImage(srcQImage));    //将 srcQImage 设置为 ui.label 的 pixmap,即在界面上显示图像。
	ui.label->resize(srcQImage.size());					   //调整 ui.label 控件的大小以适应图像大小。

	ui.label->show();										//显示标签
}


void QTvision::on_displayButton_clicked()					//播放按钮
{
	if (isCamera)											//如果是1,true,则开启相机
	{
		capture.open(0);
	}
	else
	{
		capture.open("C:/Users/Desktop/test.mp4");	//播放视频
	}
	timer->start(33);										 //启动定时器,时间间隔为33ms,就是每隔33ms,发出一个timeout信号,与signal联系,那么帧率则是1000/33≈30帧
}

void QTvision::on_buttond_clicked()						//大播放,帧率100帧
{
	capture.open(0);

	timer->start(10);
}

void QTvision::on_stopButton_clicked()
{
	timer->stop();								//定时器停止
	capture.release();							//释放视频捕获对象 capture 的资源,关闭打开的视频文件或者摄像头,防止时间过长,卡顿
}

QTvision.h

#pragma once
#include <QtWidgets/QWidget>
#include "ui_QTvision.h"
#include <opencv2\opencv.hpp>
#include <QTimer>
#include <QLabel>
#include <QPixmap>
#include <opencv2/xphoto.hpp>
#pragma execution_character_set("utf-8")//运行字符编码要写这行,否则中文乱码


using namespace cv;



class QTvision : public QWidget 
{
	Q_OBJECT

public:
	QTvision(QWidget *parent = Q_NULLPTR);

private:	


	Ui::QTvision ui;			//声明ui界面
	VideoCapture capture;		//声明一个名为capture的VideoCapture对象
	QTimer *timer;				//声明一个QTimer类型的指针
	Mat frame;					//声明一个mat类型的frame			
	bool isCamera = 0;			//相机选择清零

	private slots:

	void on_comboBox_currentIndexChanged();			//下拉框选择
	void importFrame();
	void on_displayButton_clicked();
	void on_stopButton_clicked();
	void on_buttond_clicked();
};


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值