环境:Ubuntu16.04+QT5.8+Opencv3.3.1
实现功能
- 图像处理: 建立一个QT界面,打开指定路径下的图片,点击处理后对图像进行相应处理(如,变成灰度图像),点击按钮关闭界面.
- 视频处理: 建立一个QT界面,打开指定路径下的视频,点击处理后对视频进行相应处理(变成灰度图像/变回彩色图像),点击按钮关闭界面.
创建项目
首先新建一个项目,选择Qt Widgets Application:
然后,选择’项目’,选择’构建目录’为当前程序运行目录.
pro文件配置
在pro文件中配置opencv库文件.
通过INCLUDEPATH引入头文件包含路径,通过LIBS引入需要用到的动态链接库.
INCLUDEPATH += /usr/local/include \
/usr/local/include/opencv \
/usr/local/include/opencv2
LIBS += /usr/local/lib/libopencv_imgproc.so \
/usr/local/lib/libopencv_highgui.so \
/usr/local/lib/libopencv_core.so \
/usr/local/lib/libopencv_imgcodecs.so \
/usr/local/lib/libopencv_video.so \
/usr/local/lib/libopencv_videoio.so \
界面文件
双击’界面文件’下的**.ui文件:
拖入3个Push Button和1个Label.
Label调整至适当大小,右击选择’改变对象名称’为”showImageLabel”,并右击选择’改变样式表’–>’添加颜色’–>’background-color’选择一个适当的颜色.
Button作水平布局,右击选择’改变对象名称’依次为”openButton” “processButton” “closeButton”.
如图:
分别右击Button选择’转到槽’,选择clicked().
图像处理
头文件
打开mainwindow.h文件,在MainWindow类下将用到的对象进行声明.
Mat src;
QImage Qimg;
QString filename;
mainwindow.h文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#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 on_openButton_clicked();
void on_closeButton_clicked();
void on_processButton_clicked();
private:
Ui::MainWindow *ui;
Mat src;
QImage Qimg;
QString filename;
};
#endif // MAINWINDOW_H
源文件
打开mainwindow.cpp文件,在on_openButton_clicked()函数下添加打开图片与显示图片部分.在on_processButton_clicked()函数下进行图片处理以及处理后的显示部分.
mainwindow.cpp文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <opencv2/opencv.hpp>
#include <QImage>
using namespace cv;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_closeButton_clicked()
{
close();
}
void MainWindow::on_openButton_clicked()
{
//获取文件路径 "." 代表程序运行目录
filename = QFileDialog::getOpenFileName( this, tr("Open Image"), ".",tr("Image Files(*.png *.jpg *.jpeg *.bmp)"));
if(filename.length()<=0)
return;
src=imread(filename.toUtf8().data());
if(src.empty())
return;
cvtColor( src, src, CV_BGR2RGB );
//将Mat转为QImage RGB图: QImage::Format_RGB888
Qimg = QImage( (const unsigned char*)(src.data), src.cols, src.rows, QImage::Format_RGB888 );
//显示图片
ui->showImageLabel->setPixmap( QPixmap::fromImage(Qimg));
//调整合理尺寸
ui->showImageLabel->resize( ui->showImageLabel->pixmap()->size());
}
void MainWindow::on_processButton_clicked()
{
if(src.channels()==3)
{
cvtColor( src, src, CV_RGB2GRAY );
}
//灰度图: QImage::Format_Grayscale8
Qimg = QImage( (const unsigned char*)(src.data), src.cols, src.rows, QImage::Format_Grayscale8 );
ui->showImageLabel->setPixmap( QPixmap::fromImage(Qimg));
ui->showImageLabel->resize( ui->showImageLabel->pixmap()->size());
}
运行效果:
加载图片:
处理图片:
视频处理
头文件
在原基础上添加一个延时函数声明.
void DelayMS(unsigned int ms);
头文件mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#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 on_openButton_clicked();
void on_closeButton_clicked();
void on_processButton_clicked();
private:
Ui::MainWindow *ui;
Mat src;
QImage Qimg;
QString filename;
void DelayMS(unsigned int ms);
};
#endif // MAINWINDOW_H
源文件
打开mainwindow.cpp文件,在on_openButton_clicked()函数下添加打开视频与处理部分并显示视频的每一帧.在on_processButton_clicked()函数下改变处理视频标志process已决定是否对视频进行处理.
mainwindow.cpp文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <opencv2/opencv.hpp>
#include <opencv2/video.hpp>
#include <QImage>
#include <qdebug.h>
#include <QTime>
using namespace cv;
bool process = false;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_closeButton_clicked()
{
close();
}
void MainWindow::on_openButton_clicked()
{
QString filename =QFileDialog::getOpenFileName(this,tr("Open Video File"),".",tr("Video Files(*.avi *.mp4 *.flv *.mkv)"));
if(filename.length()<=0)
return;
VideoCapture capture;
src = capture.open(filename.toLocal8Bit().data());
if(!capture.isOpened()){
qDebug() << QString::fromLocal8Bit("视频未成功打开!");
return;
}
while (capture.read(src)) {
if(src.empty()){
qDebug() << QString::fromLocal8Bit("视频未成功读取!");
return;
}
//获取帧率
double rate = capture.get(CV_CAP_PROP_FPS);
int delay = 1000 / rate;
DelayMS(delay);
cvtColor( src, src, CV_BGR2RGB );
if(process){
if(src.channels()==3)
{
cvtColor( src, src, CV_RGB2GRAY );
}
//灰度图: QImage::Format_Grayscale8
Qimg = QImage( (const unsigned char*)(src.data), src.cols, src.rows, QImage::Format_Grayscale8 );
ui->showImageLabel->setPixmap( QPixmap::fromImage(Qimg));
ui->showImageLabel->resize( ui->showImageLabel->pixmap()->size());
}
else {
Qimg = QImage( (const unsigned char*)(src.data), src.cols, src.rows, QImage::Format_RGB888 );
//显示图片
ui->showImageLabel->setPixmap( QPixmap::fromImage(Qimg));
//调整合理尺寸
ui->showImageLabel->resize( ui->showImageLabel->pixmap()->size());
}
}
}
void MainWindow::on_processButton_clicked()
{
process = !process;
}
void MainWindow::DelayMS(unsigned int ms)
{
QTime Timer = QTime::currentTime().addMSecs(ms);
while( QTime::currentTime() < Timer )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
运行效果:
处理结果: