Ubuntu:QT界面+OpenCV3图像/视频处理

环境: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());
}

运行效果:

扫描二维码关注公众号,回复: 2119440 查看本文章

这里写图片描述
加载图片:
这里写图片描述
处理图片:
这里写图片描述

视频处理

头文件

在原基础上添加一个延时函数声明.

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);
}

运行效果:

这里写图片描述

处理结果:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/akadiao/article/details/80748305
今日推荐