【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页面内容采用默认,可以自己规划命名。

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

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

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

【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】
(2)mainwindow.h文件添加头包含:
#include "opencv2/opencv.hpp"

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

二、UI设计

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

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

三、mainwindow.h文件

头文件包含增加:
    #include <qgraphicsscene>
    #include <qgraphicspixmapitem>
    #include <qfiledialog>
&#x69FD;&#x51FD;&#x6570;&#xFF1A;
    void on_actionOpen_triggered()
    void on_action_Save_triggered();
&#x5BF9;&#x8C61;&#x589E;&#x52A0;&#xFF1A;
    scene;
    srcPixmap;
    srcImage;
    srcMat;
</qfiledialog></qgraphicspixmapitem></qgraphicsscene>
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include
#include "opencv2/opencv.hpp"
#include
#include
#include

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;

    cv::Mat* srcMat;
};

#endif

四、mainwindow.cpp文件

&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x5B9E;&#x73B0;&#xFF1A;
    1&#x3001;&#x521D;&#x59CB;&#x5316;scene, srcPixmap, srcImage, srcMat&#x5BF9;&#x8C61;&#xFF1B;
    2&#x3001;&#x5C06;&#x5BF9;&#x8C61;&#x5143;&#x7D20;&#x6DFB;&#x52A0;&#x5230;&#x573A;&#x666F;&#x4E2D;&#xFF1B;
    3&#x3001;&#x5C06;&#x573A;&#x666F;&#x5BF9;&#x8C61;&#x6DFB;&#x52A0;&#x5230;&#x89C6;&#x56FE;&#x4E2D;&#x8FDB;&#x884C;&#x663E;&#x793A;
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include

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

    scene->addItem(srcPixmap);

    ui->graphicsView->setScene(scene);

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

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

        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())
    {

        cv::imwrite(fileName.toStdString(), *srcMat);
        ui->statusBar->showMessage("Save Successful", 0);
    }
    else
    {
        ui->statusBar->showMessage("Please make sure the file exist.", 0);
        return;
    }

}

五、运行展示

&#x70B9;&#x51FB;File&#x53EF;&#x9009;&#x62E9;&#x6253;&#x5F00;&#x6216;&#x8005;&#x53E6;&#x5B58;&#x56FE;&#x7247;&#xFF1B;

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

总结

以上是关于利用Qt控件GraphicsView显示OpenCV读入的图像,简明扼要的进行了总结,需要进一步理解Qt中视图–>场景–>对象元素的关系。其中疑问或错误,欢迎联系交流,微信:electrical_program

Original: https://blog.csdn.net/richard_yuu/article/details/124140746
Author: richard_yuu
Title: 【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/641178/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球