基于Qt的OpenCV计算机视觉(笔记)

系统Ubuntu 18.04 LTS
OpenCV4.5.1
Qt5.9.1

〇、 配置环境

  1. Qt OpenCV 安装完成后,打开终端
gedit .bashrc //或者 vi .bashrc //:wq 保存并退出(别忘了冒号:)
  1. 键入(Qt中的gcc_64的路径自行替换):
# QT and qmake home
export QMAKE_HOME=/opt/Qt5.9.1/5.9.1/gcc_64/
export PATH=$QMAKE_HOME/bin:$PATH
  1. 保存退出

  2. 回到终端

source .bashrc

一、打开图像

  1. 打开Qt Creator,新建项目,项目名:ImageViewer,基类(base class)选择QMainWindow
  2. mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QGraphicsScene>
#include <QPushButton>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

//菜单栏、工具栏、图像场景、状态栏
private:
    QMenu *fileMenu;
    QMenu *viewMenu;

    QToolBar *fileToolBar;
    QToolBar *viewToolBar;

    QGraphicsScene *imageScene;
    QGraphicsView *imageView;

    QStatusBar *mainStatusBar;
    QLabel *mainStatusLabel;

//用于显示菜单栏、工具栏、图像场景、状态栏
private:
    void initUI();
    
//按键
private:
    QAction *openAction;
//    QPushButton *exitAction;

//声明槽函数
private slots:
    void openImage();
    void showImage(QString path);

};

#endif // MAINWINDOW_H

  1. mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGraphicsScene>
#include <QLabel>
#include <QGraphicsView>
#include <QDebug>
#include <QFileDialog>

//主窗口
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initUI();

    connect(openAction,SIGNAL(triggered(bool)),this,SLOT(openImage()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

//菜单栏、、图像场景、状态栏、按键
void MainWindow::initUI()
{
    this->resize(800,600);

    //菜单栏
    fileMenu = menuBar()->addMenu("文件");
    viewMenu = menuBar()->addMenu("查看");

    //图像场景
    imageScene = new QGraphicsScene(this);
    imageView = new QGraphicsView(imageScene);
    setCentralWidget(imageView);

    //状态栏
    mainStatusBar = statusBar();
    mainStatusLabel = new QLabel(mainStatusBar);
    mainStatusBar->addPermanentWidget(mainStatusLabel);
    mainStatusLabel->setText("图片信息将显示在此!");

    openAction = new QAction("&打开",this);
    fileMenu->addAction(openAction);

//    exitAction = new QPushButton("退出",this);
}

//打开图像
void MainWindow::openImage()
{
    qDebug() << "我是傻逼(没人会发现的吧)";

    QFileDialog dialog(this);
    dialog.setWindowTitle("打开图像");
    dialog.setFileMode(QFileDialog::ExistingFile);
    dialog.setNameFilter(tr("Images (*.png *.bmp *.jpg)"));
    QStringList filePaths;
    if(dialog.exec())
    {
        filePaths = dialog.selectedFiles();
        showImage(filePaths.at(0));
    }
}

//显示图像
void MainWindow::showImage(QString path)
{
    imageScene->clear();
    imageView->resetMatrix();
    QPixmap image(path);
    imageScene->addPixmap(image);
    imageScene->update();
    imageView->setSceneRect(image.rect());
    QString status = QString ("%1, %2x%3, %4 Bytes").arg(path).arg(image.width()).arg(image.height()).arg(QFile(path).size());
    mainStatusLabel->setText(status);
}
  1. 保存全部
    Ctrl + Shift + S
  2. 打开终端
qmake -makefile
make
./ImageViewer
  1. 打开图像
    左上角 文件 > 打开,选择图像并打开
  2. 最终效果
    在这里插入图片描述在这里插入图片描述

二、保存图像

在前面的基础上,加上保存图像功能,为了避免头晕,直接贴代码

  1. mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QGraphicsScene>
#include <QPushButton>
#include <QGraphicsPixmapItem>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private:
    void initUI();

private:
    QMenu *fileMenu;
    QMenu *viewMenu;

    QToolBar *fileToolBar;
    QToolBar *viewToolBar;

    QGraphicsScene *imageScene;
    QGraphicsView *imageView;

    QStatusBar *mainStatusBar;
    QLabel *mainStatusLabel;

private:
    QGraphicsPixmapItem *currentImage;

private:
    QAction *openAction;
    QAction *saveAsAction;

//声明槽
private slots:
    void openImage();
    void showImage(QString path);
    void saveAs();
};

#endif // MAINWINDOW_H

  1. mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGraphicsScene>
#include <QLabel>
#include <QGraphicsView>
#include <QDebug>
#include <QFileDialog>
#include <QMessageBox>

//主窗口
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initUI();

    connect(openAction,SIGNAL(triggered(bool)),this,SLOT(openImage()));
    connect(saveAsAction,SIGNAL(triggered(bool)),this,SLOT(saveAs()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

//界面
void MainWindow::initUI()
{
    this->resize(800,600);
    this->setWindowTitle("ImageViewer");

    //菜单栏
    fileMenu = menuBar()->addMenu("文件");
    viewMenu = menuBar()->addMenu("查看");

    //图像场景
    imageScene = new QGraphicsScene(this);
    imageView = new QGraphicsView(imageScene);
    setCentralWidget(imageView);

    //状态栏
    mainStatusBar = statusBar();
    mainStatusLabel = new QLabel(mainStatusBar);
    mainStatusBar->addPermanentWidget(mainStatusLabel);
    mainStatusLabel->setText("图片信息将显示在此!");

	//打开、保存图像按键
    openAction = new QAction("&打开",this);
    fileMenu->addAction(openAction);
    saveAsAction = new QAction("&保存",this);
    fileMenu->addAction(saveAsAction);
}

//打开图像
void MainWindow::openImage()
{
    qDebug() << "我是傻逼(没人会发现的吧)";

    //设置对话窗口
    QFileDialog dialog(this);
    dialog.setWindowTitle("打开图像");
    dialog.setFileMode(QFileDialog::ExistingFile);
    dialog.setNameFilter(tr("Images (*.png *.bmp *.jpg)"));
    
    QStringList filePaths;
    if(dialog.exec()){
        filePaths = dialog.selectedFiles();
        showImage(filePaths.at(0));
    }
}

void MainWindow::showImage(QString path)
{
    imageScene->clear();
    imageView->resetMatrix();
    QPixmap image(path);
    currentImage = imageScene->addPixmap(image);
    imageScene->update();
    imageView->setSceneRect(image.rect());
    QString status = QString ("%1, %2x%3, %4 Bytes").arg(path).arg(image.width()).arg(image.height()).arg(QFile(path).size());
    mainStatusLabel->setText(status);

}

//保存图像
void MainWindow::saveAs()
{
    //判断有无图像
    if (currentImage == nullptr){
        QMessageBox::information(this,"信息","啥都没有,怎么保存");
        return;
    }

    //设置对话窗口(标题,模式,接受模式,后缀过滤)
    QFileDialog dialog(this);
    dialog.setWindowTitle("保存图像");
    dialog.setFileMode(QFileDialog::AnyFile);
    dialog.setAcceptMode(QFileDialog::AcceptSave);
    dialog.setNameFilter(tr("Images (*.png *.bmp *.jpg)"));

    QStringList fileNames;
    if (dialog.exec())
    {
        fileNames = dialog.selectedFiles();
        if(QRegExp(".+\\.(png|bmp|jpg)").exactMatch(fileNames.at(0)))
        {
            currentImage->pixmap().save(fileNames.at(0));
        }
        else
        {
            QMessageBox::information(this,"信息","保存错误:格式或文件名不对劲");
        }
    }
}
  1. 保存全部
    Ctrl + Shift + S
  2. 打开终端
qmake -makefile
make
./ImageViewer
  1. 打开图像
    左上角 文件 > 打开,选择图像并打开
  2. 保存图像
    左上角 文件 > 保存,输入图像的名称(包括后缀)
  3. 最终效果
    在这里插入图片描述

三、OpwnCV 模糊

  1. 配置

新建项目,在工程文件加入

INCLUDEPATH += /usr/local/include/opencv4

LIBS += /usr/local/lib/lib*
  1. mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QGraphicsScene>
#include <QPushButton>
#include <QGraphicsPixmapItem>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private:
    void initUI();

private:
    QMenu *fileMenu;
    QMenu *viewMenu;
    QMenu *editMenu;

    QToolBar *fileToolBar;
    QToolBar *viewToolBar;
    QToolBar *editToolBar;

    QGraphicsScene *imageScene;
    QGraphicsView *imageView;

    QStatusBar *mainStatusBar;
    QLabel *mainStatusLabel;
    QLabel *status;

private:
    QGraphicsPixmapItem *currentImage;
//    QString *currentImagePath;

private:
    QAction *openAction;
    QAction *saveAsAction;
    QAction *blurAction;
//    QAction *prevAction;

//声明槽
private slots:
    void openImage();
    void showImage(QString path);
    void saveAs();
    void blurImage();
//    void prevImage();
};

#endif // MAINWINDOW_H

  1. mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGraphicsScene>
#include <QLabel>
#include <QGraphicsView>
#include <QDebug>
#include <QFileDialog>
#include <QMessageBox>
#include <QFileInfo>

#include "opencv2/opencv.hpp"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initUI();

    connect(openAction,SIGNAL(triggered(bool)),this,SLOT(openImage()));
    connect(saveAsAction,SIGNAL(triggered(bool)),this,SLOT(saveAs()));
//    connect(prevAction,SIGNAL(triggered(bool)),this,SLOT(prevImage()));
    connect(blurAction,SIGNAL(triggered(bool)),this,SLOT(blurImage()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::initUI()
{
    this->resize(800,600);
    this->setWindowTitle("工业视觉");

    //菜单栏
    fileMenu = menuBar()->addMenu("文件");
    viewMenu = menuBar()->addMenu("查看");

    //图像场景
    imageScene = new QGraphicsScene(this);
    imageView = new QGraphicsView(imageScene);
    setCentralWidget(imageView);

    //状态栏
    mainStatusBar = statusBar();
    mainStatusLabel = new QLabel(mainStatusBar);
    mainStatusBar->addPermanentWidget(mainStatusLabel);
    mainStatusLabel->setText("图片信息将显示在此!");

    openAction = new QAction("&打开",this);
    fileMenu->addAction(openAction);
    saveAsAction = new QAction("&保存",this);
    fileMenu->addAction(saveAsAction);

    blurAction = new QAction("模糊",this);
    editMenu = menuBar()->addMenu("&图像处理");
    editMenu->addAction(blurAction);
}

void MainWindow::openImage()
{
    qDebug() << "我是傻逼(没人会发现的吧)";

    //设置对话窗口
    QFileDialog dialog(this);
    dialog.setWindowTitle("打开图像");
    dialog.setFileMode(QFileDialog::ExistingFile);
    dialog.setNameFilter(tr("Images (*.png *.bmp *.jpg)"));

    QStringList filePaths;
    if(dialog.exec()){
        filePaths = dialog.selectedFiles();
        showImage(filePaths.at(0));
    }
}

void MainWindow::showImage(QString path)
{
    imageScene->clear();
    imageView->resetMatrix();
    QPixmap image(path);
    currentImage = imageScene->addPixmap(image);
    imageScene->update();
    imageView->setSceneRect(image.rect());
    QString status = QString ("%1, %2x%3, %4 Bytes").arg(path).arg(image.width()).arg(image.height()).arg(QFile(path).size());
    mainStatusLabel->setText(status);
}


//保存图像
void MainWindow::saveAs()
{
    //判断有无图像
    if (currentImage == nullptr){
        QMessageBox::information(this,"信息","啥都没有,怎么保存");
        return;
    }

    //设置对话窗口(标题,模式,接受模式,后缀过滤)
    QFileDialog dialog(this);
    dialog.setWindowTitle("保存图像");
    dialog.setFileMode(QFileDialog::AnyFile);
    dialog.setAcceptMode(QFileDialog::AcceptSave);
    dialog.setNameFilter(tr("Images (*.png *.bmp *.jpg)"));

    QStringList fileNames;
    if (dialog.exec())
    {
        fileNames = dialog.selectedFiles();
        if(QRegExp(".+\\.(png|bmp|jpg)").exactMatch(fileNames.at(0)))
        {
            currentImage->pixmap().save(fileNames.at(0));
        }
        else
        {
            QMessageBox::information(this,"信息","保存错误:格式或文件名不对劲");
        }
    }
}

//模糊
void MainWindow::blurImage()
{
    qDebug() << "模糊图像!";

    //QPixmap_to_QImag
    QPixmap pixmap = currentImage->pixmap();
    QImage image = pixmap.toImage();

    //QImage_to_Mat
    image = image.convertToFormat(QImage::Format_RGB888);
    cv::Mat mat = cv::Mat(image.height(),image.width(),CV_8UC3,image.bits(),image.bytesPerLine());

    cv::Mat tmp;
    cv::blur(mat,tmp,cv::Size(8,8));
    mat = tmp;

	//模糊
    QImage image_blurred(
                mat.data,
                mat.cols,
                mat.rows,
                mat.step,
                QImage::Format_RGB888);
    //QImage_to_QPixmap
    pixmap = QPixmap::fromImage(image_blurred);
    //清空场景
    imageScene->clear();
    imageView->resetMatrix();
    currentImage = imageScene->addPixmap(pixmap);
    imageScene->update();
    imageView->setSceneRect(pixmap.rect());

    QString status = QString("(图像已编辑) %1 x%2").arg(pixmap.width()).arg(pixmap.height());
    mainStatusLabel->setText(status);
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值