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


前言

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


一、新建Qt项目[ProjCV]

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

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

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库的路径

在这里插入图片描述
(2)mainwindow.h文件添加头包含:

#include "opencv2/opencv.hpp"

在这里插入图片描述

二、UI设计

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

在这里插入图片描述
在这里插入图片描述

三、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控件GraphicsView显示OpenCV读入的图像,简明扼要的进行了总结,需要进一步理解Qt中视图–>场景–>对象元素的关系。其中疑问或错误,欢迎联系交流,微信:electrical_program

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值