系统 | Ubuntu 18.04 LTS |
---|---|
OpenCV | 4.5.1 |
Qt | 5.9.1 |
〇、 配置环境
gedit .bashrc //或者 vi .bashrc //:wq 保存并退出(别忘了冒号:)
- 键入(
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
-
保存退出
-
回到
终端
source .bashrc
一、打开图像
- 打开
Qt Creator
,新建项目,项目名:ImageViewer
,基类(base class)选择QMainWindow
- 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
- 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);
}
- 保存全部
Ctrl + Shift + S
- 打开
终端
qmake -makefile
make
./ImageViewer
- 打开图像
左上角文件 > 打开
,选择图像并打开 - 最终效果
二、保存图像
在前面的基础上,加上保存图像功能,为了避免头晕,直接贴代码
- 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
- 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,"信息","保存错误:格式或文件名不对劲");
}
}
}
- 保存全部
Ctrl + Shift + S
- 打开
终端
qmake -makefile
make
./ImageViewer
- 打开图像
左上角文件 > 打开
,选择图像并打开 - 保存图像
左上角文件 > 保存
,输入图像的名称
(包括后缀) - 最终效果
三、OpwnCV 模糊
- 配置
新建项目,在工程文件
加入
INCLUDEPATH += /usr/local/include/opencv4
LIBS += /usr/local/lib/lib*
- 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
- 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);
}