Qt OpenCV 学习(三):跟踪视频中的运动物体
2023-12-13 17:31:24
1. mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <opencv2/opencv.hpp>
#include <QTimer>
#include <QPixmap>
#include <QDebug>
#include <QImage>
using namespace cv;
using namespace std;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_btnPlay_clicked();
void on_btnStop_clicked();
void importFrame();
private:
Ui::MainWindow *ui;
VideoCapture capture;
QTimer *timer;
Mat frame;
Ptr<BackgroundSubtractorMOG2>ptrMOG;
};
#endif // MAINWINDOW_H
2. mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
ui->setupUi(this);
this->setWindowTitle("Video Play With Qt");
// 高斯混合背景处理,创建一个 MOG2 背景提取器并应用
ptrMOG = createBackgroundSubtractorMOG2(500, 16, false);
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(importFrame()));
}
MainWindow::~MainWindow() {
delete ui;
}
void MainWindow::on_btnPlay_clicked() {
capture.open("D:\\BaiduNetdiskDownload\\bike.avi");
double rate = capture.get(CAP_PROP_FPS);
double timerDelay = 1000 / rate;
timer->start(timerDelay);
}
void MainWindow::on_btnStop_clicked() {
timer->stop();
capture.release();
}
void MainWindow::importFrame() {
Mat currentFrame;
Mat grayFrame, foreGround;
capture >> currentFrame;
if (!currentFrame.empty()) {
qDebug() << "Video is running...";
Mat result = currentFrame.clone();
ptrMOG->apply(currentFrame, foreGround, 0.05);
threshold(foreGround, foreGround, 25, 255, THRESH_BINARY);
// 腐蚀操作消除噪声
Mat kernelErode = getStructuringElement(MORPH_RECT, Size(5, 5));
erode(foreGround, foreGround, kernelErode);
// 膨胀操作突出目标
Mat kernelDilate = getStructuringElement(MORPH_RECT, Size(11, 11));
dilate(foreGround, foreGround, kernelDilate);
// 框选运动目标
vector<vector<Point>>contours;
findContours(foreGround, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
for (uint64 i = 0; i < contours.size(); i++) {
rectangle(result, boundingRect(contours[i]), Scalar(0, 255, 255), 1);
}
cvtColor(result, result, COLOR_BGR2RGB);
QImage showVideo = QImage((const unsigned char*)(result.data), result.cols, result.rows, result.step, QImage::Format_RGB888);
ui->labelVideo->setPixmap(QPixmap::fromImage(showVideo.scaled(ui->labelVideo->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)));
} else {
qDebug() << "Play is over.";
timer->stop();
}
}
文章来源:https://blog.csdn.net/qq_42994487/article/details/134825246
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!