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

简介: 【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中视图–>场景–>对象元素的关系。其中疑问或错误,


目录
相关文章
|
4月前
|
计算机视觉
Opencv学习笔记(十二):图片腐蚀和膨胀操作
这篇文章介绍了图像腐蚀和膨胀的原理、作用以及使用OpenCV实现这些操作的代码示例,并深入解析了开运算和闭运算的概念及其在图像形态学处理中的应用。
243 1
Opencv学习笔记(十二):图片腐蚀和膨胀操作
|
5月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
207 7
|
4月前
|
计算机视觉 Python
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
使用OpenCV库将一个文件夹内的所有彩色图片批量转换为灰度图,并提供了相应的Python代码示例。
55 0
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
|
4月前
|
计算机视觉 Python
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
这篇博客介绍了如何使用OpenCV库在Python中将图片保存到指定目录,以及如何将文件夹中的所有图片读取并以数组形式输出。
313 0
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
|
5月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
252 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
|
4月前
|
计算机视觉
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
在使用OpenCV的cv2模块保存带有中文命名的图片时,直接使用cv2.imwrite()会导致乱码问题,可以通过改用cv2.imencode()方法来解决。
236 0
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
|
6月前
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
547 1
|
4月前
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
91 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
5月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
83 10
|
5月前
|
机器学习/深度学习 Java 计算机视觉
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
本文记录了使用mingw81_64编译OpenCV 4.5.5、Qt 5.15.2、VTK 9.1的详细过程,包括编译结果截图、编译步骤、遇到的问题及其解决方案,以及相关参考链接。文中还提到了如何编译boost源码为静态库,并提供了测试代码示例。
159 0
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录