文章目录

  • 前言
  • 一、新建Qt项目[ProjCV]
  • 1. Qt--如下7图所示建立新项目,命名:ProjCV,Detials页面内容采用默认,可以自己规划命名。
  • 2. OpenCV--在.pro和.h文件中添加配置
  • 二、UI设计
  • 三、mainwindow.h文件
  • 四、mainwindow.cpp文件
  • 五、运行展示
  • 总结



前言

越来越多的开发人员选择基于开源的Qt框架与OpenCV来实现界面和算法,其原因不单单是无版权问题,更多是两个社区的发展蓬勃,可用来学习的资料与例程特别丰富。以下是关于利用Qt控件GraphicsView显示OpenCV读入的图像,并另存。
软件版本:Qt-5.12.0/OpenCV-4.5.3
平台:Windows10/11–64


一、新建Qt项目[ProjCV]

1. Qt–如下7图所示建立新项目,命名:ProjCV,Detials页面内容采用默认,可以自己规划命名。

【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】_opencv


【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】_图像处理_02


【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】_opencv_03


【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】_图像处理_04


【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】_c++_05


【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】_c++_06


【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】_opencv_07

2. OpenCV–在.pro和.h文件中添加配置

(1)ProjCV.pro文件添加如下代码:
INCLUDEPATH += C:/opencv-4.5.3/build/install/include	// OpenCV的头文件路径
LIBS += C:/opencv-4.5.3/build/install/x64/mingw/lib/libopencv_world*.a		//OpenCV库的路径

【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】_qt5_08


(2)mainwindow.h文件添加头包含:

#include "opencv2/opencv.hpp"

【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】_#include_09

二、UI设计

制作如下Form:
	menuBar添加:
		1.  Open,添加 triggered() 槽;
		2. Save,添加 triggered() 槽;
	centralWidget添加:GraphicsView控件;

【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】_图像处理_10


【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】_c++_11

三、mainwindow.h文件

头文件包含增加:
	#include <QGraphicsScene> 
	#include <QGraphicsPixmapItem>
	#include <QFileDialog>
槽函数:
	void on_actionOpen_triggered()
	void on_action_Save_triggered();
对象增加:
	scene;
	srcPixmap;
	srcImage;
	srcMat;
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "opencv2/opencv.hpp"
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QFileDialog>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    // 打开文件槽函数
    void on_actionOpen_triggered();

    // 另存文件槽函数
    void on_action_Save_triggered();

private:
    Ui::MainWindow *ui;

    QGraphicsScene* scene; // 场景
    QGraphicsPixmapItem* srcPixmap;	// 对象元素
    QImage* srcImage;	// QImage对象

    cv::Mat* srcMat;	//OpenCV中的Mat对象
};

#endif // MAINWINDOW_H

四、mainwindow.cpp文件

以下代码实现:
	1、初始化scene, srcPixmap, srcImage, srcMat对象;
	2、将对象元素添加到场景中;
	3、将场景对象添加到视图中进行显示
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDebug>

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

    scene = new QGraphicsScene();
    srcPixmap = new QGraphicsPixmapItem();
    srcImage = new QImage();
    srcMat = new cv::Mat();

    // 将QGraphicsPixmapItem类添加到QGraphicsScene
    // 对象元素-->场景
    scene->addItem(srcPixmap);
    // 将QGraphicsScene添加到QGraphicsView
    // 场景-->视图
    ui->graphicsView->setScene(scene);
    // 设置QGraphicsView更新
    ui->graphicsView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);


}

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

void MainWindow::on_actionOpen_triggered()
{
    // 打开文件对话框,获取文件名
    QString fileName = QFileDialog::getOpenFileName(this,
                                                    "Open Image",
                                                    QDir::currentPath(),
                                                    "Image (*.jpg *.png *.bmp)");
    // 文件名非空,通过OpenCV的imread函数读取图片文件
    if (!fileName.isEmpty())
    {
        *srcMat = cv::imread(fileName.toStdString());
    }
    else
    {
        ui->statusBar->showMessage("Please make sure the file exist.", 0);
        return;
    }

    // 图片文件不为空,转换为要显示的对象元素
    if (!srcMat->empty())
    {
        QImage* tmpImage = new QImage(srcMat->data, srcMat->cols, srcMat->rows,
                          static_cast<int>(srcMat->step),
                          QImage::Format_RGB888);
        srcPixmap->setPixmap(QPixmap::fromImage(
                              tmpImage->rgbSwapped()));
        /*
        *srcImage = QImage(srcMat->data, srcMat->cols, srcMat->rows,
                          static_cast<int>(srcMat->step),
                          QImage::Format_RGB888);
        srcPixmap->setPixmap(QPixmap::fromImage(
                              srcImage->rgbSwapped()));
        */
        ui->statusBar->showMessage("Open Successful", 0);
        delete tmpImage;
    }
    else
    {
        ui->statusBar->showMessage("The image is empty!", 0);
    }
}

void MainWindow::on_action_Save_triggered()
{
    QString fileName = QFileDialog::getSaveFileName(this,
                                                    "Save Image",
                                                    QDir::currentPath(),
                                                    "Image (*.jpg *.png *.bmp)");
    if (!fileName.isEmpty())
    {
        // Opencv中imwrite函数,保存图片文件
        cv::imwrite(fileName.toStdString(), *srcMat);
        ui->statusBar->showMessage("Save Successful", 0);
    }
    else
    {
        ui->statusBar->showMessage("Please make sure the file exist.", 0);
        return;
    }

}

五、运行展示

点击File可选择打开或者另存图片;

【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】_c++_12


【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】_#include_13


总结

以上是关于利用Qt控件GraphicsView显示OpenCV读入的图像,简明扼要的进行了总结,需要进一步理解Qt中视图–>场景–>对象元素的关系。