QT VS2010 opencv 实现视频播放和画框

                      QT VS2010 opencv 实现视频播放和画框

因为毕业设计要求实现目标跟踪算法,最后界面化采用QT实现。本文主要介绍怎么在VS2010上利用QT和opencv播放一个视频文件,然后实现在视频文件上画框的功能。

下载安装QT

win10下的VS2010+Qt5.3.1的安装、路径配置、项目配置及各种出错记录

创建一个新的QT项目

 创建完打开qt_tracker.ui文件,添加两个按钮和一个label控件。

运行,效果图如下:

重载QLABEL类 

新建一个MyQLabel类继承QLabel类,先创建MyQLabel.h和MyQLabel.cpp文件添加到工程。

MyQLabel.h

//重载Qlabel控件
#ifndef MYQLABEL
#define MYQLABEL
 
#include <QLabel>
#include <QMouseEvent>
#include <QString>
 
class MyQLabel : public QLabel{
//    Q_OBJECT
public:
	explicit MyQLabel(QWidget *parent=0);//继承构造函数

	bool isPaint;   //是否允许画矩形
    void paintEvent(QPaintEvent* event);
    void mousePressEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent* event);
    void mouseMoveEvent(QMouseEvent* event);
    int x1, y1, x2, y2;
 
    void savePicture(QString path, int filename);
 
public:
    int getX1() {return x1;}
    int getY1() {return y1;}
    int getX2() {return x2;}
    int getY2() {return y2;}
};
 
#endif // MYQLABEL

 MyQLabel.cpp

#include <QPainter>
#include <QPen>
#include <QRect>
#include <QCursor>
#include <QApplication>
#include <QPixmap>
#include <QImage>
 
#include "myqlabel.h"
 
MyQLabel::MyQLabel(QWidget* parent):
    QLabel(parent)
{
	isPaint=false;   //初始化时不允许画框
}


void MyQLabel::paintEvent(QPaintEvent *event)
{
    //comment before
    QLabel::paintEvent(event); //绘制背景的图片
 
	if(isPaint)
	{
    QPainter painter(this);
 
    painter.setPen(QPen(Qt::red, 2));
    painter.drawRect(QRect(x1, y1, x2 - x1, y2 - y1));
	}
}
 
void MyQLabel::mousePressEvent(QMouseEvent *event)
{
	if(isPaint)
	{
    x1 = event->pos().x();
    y1 = event->pos().y();
    QCursor cursor;
    cursor.setShape(Qt::ClosedHandCursor);
    QApplication::setOverrideCursor(cursor);
	}
}
 
void MyQLabel::mouseReleaseEvent(QMouseEvent *event)
{
	if(isPaint)
	{
    x2 = event->pos().x(); //鼠标相对于所在控件的位置
    y2 = event->pos().y();
    update();
    QApplication::restoreOverrideCursor();
	}
}
 
void MyQLabel::mouseMoveEvent(QMouseEvent *event)
{
	if(isPaint)
	{
    if (event->buttons() & Qt::LeftButton) {
        x2 = event->pos().x(); //鼠标相对于所在控件的位置
        y2 = event->pos().y();
        update();
    }
	}
}

然后再打开qt_tracker.ui,将Qlabel提示为重建的类

右键我们刚才的Label控件,选择【提升为...】。

 选择刚才重建的类,点击【添加】,选择后选择【提升】。

这样便实现了重载控件,我们可以再控件上自由画框了。 

利用opencv播放视频

现在qt_tracker.h添加相关变量定义和头文件,以及在qt_tracker.cpp实现方法。以下是两个文件的内容:

qt_tracker.h

#ifndef QT_TRACKER_H
#define QT_TRACKER_H

#include <QtWidgets/QMainWindow>
#include "ui_qt_tracker.h"

#include "QTimer"
#include "QImage"
#include "opencv2/opencv.hpp"
 
using namespace cv;

class QT_Tracker : public QMainWindow
{
	Q_OBJECT

public:
	QT_Tracker(QWidget *parent = 0);
	~QT_Tracker();

private:
	Ui::QT_TrackerClass ui;

private slots:
	void ReadFrame();
    void OpenCameraClicked();

private:
    VideoCapture capture;
    QTimer *timer;
    Mat frame;
};

#endif // QT_TRACKER_H

qt_tracker.cpp

#include "qt_tracker.h"

QT_Tracker::QT_Tracker(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
	timer=new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(ReadFrame()));
}

QT_Tracker::~QT_Tracker()
{

}

void QT_Tracker::OpenCameraClicked()
{
	//capture.open("D://1.mp4");//打开摄像头
	capture.open(0);
	capture.set(CV_CAP_PROP_FRAME_WIDTH, 400.0);
    capture.set(CV_CAP_PROP_FRAME_HEIGHT, 300.0);
    
	timer->start(25);//开启定时器,一次25ms
}


void QT_Tracker::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));
    */
    rectangle(frame, Rect(0,0,20,20), Scalar(200,0,0),2);	//画出FCT判断的位置
    //将视频显示到label上
    QImage image = QImage((const uchar*)frame.data,frame.cols,frame.rows,QImage::Format_RGB888).rgbSwapped();
	//image=image.scaled(100,100);
	 //QImage image = QImage((const uchar*)frame.data,300,400,QImage::Format_RGB888).rgbSwapped();
	//ui.label->SetsetStyleSheet("color: white");
	ui.label->setPixmap(QPixmap::fromImage(image));
}

添加完成后,需要通过qt_tracker.ui将他们关联起来,打开qt_tracker.ui,点击【编辑信号/槽】,给按钮添加响应函数。

完成,然后执行程序。

好了,可以播放视频了,而且可以随便画框了。

---------------------------------------------------------------

更新于2020/05/01

添加了VS2010的源代码,可直接运行。

https://download.csdn.net/download/Jonh_/12379608

--------------------------------------------------------------

 

 

结束语

  • 今天和杨过在他们教室学习,
  • 然后我是菜鸟,今天是我第三天学习QT,大佬们看到错误了在下面指正,我会修正的。

参考地址

https://blog.csdn.net/chengzijuzhen/article/details/76447646

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值