因为毕业设计要求实现目标跟踪算法,最后界面化采用QT实现。本文主要介绍怎么在VS2010上利用QT和opencv播放一个视频文件,然后实现在视频文件上画框的功能。
win10下的VS2010+Qt5.3.1的安装、路径配置、项目配置及各种出错记录
创建完打开qt_tracker.ui文件,添加两个按钮和一个label控件。
运行,效果图如下:
新建一个MyQLabel类继承QLabel类,先创建MyQLabel.h和MyQLabel.cpp文件添加到工程。
MyQLabel.h
//重载Qlabel控件
#ifndef MYQLABEL
#define MYQLABEL
#include
#include
#include
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
#include
#include
#include
#include
#include
#include
#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();
}
}
}
右键我们刚才的Label控件,选择【提升为...】。
选择刚才重建的类,点击【添加】,选择后选择【提升】。
这样便实现了重载控件,我们可以再控件上自由画框了。
现在qt_tracker.h添加相关变量定义和头文件,以及在qt_tracker.cpp实现方法。以下是两个文件的内容:
qt_tracker.h
#ifndef QT_TRACKER_H
#define QT_TRACKER_H
#include
#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,点击【编辑信号/槽】,给按钮添加响应函数。
完成,然后执行程序。
好了,可以播放视频了,而且可以随便画框了。
https://blog.csdn.net/chengzijuzhen/article/details/76447646