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


目录
相关文章
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
432 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
计算机视觉
Opencv学习笔记(十二):图片腐蚀和膨胀操作
这篇文章介绍了图像腐蚀和膨胀的原理、作用以及使用OpenCV实现这些操作的代码示例,并深入解析了开运算和闭运算的概念及其在图像形态学处理中的应用。
1287 1
Opencv学习笔记(十二):图片腐蚀和膨胀操作
|
计算机视觉
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
在使用OpenCV的cv2模块保存带有中文命名的图片时,直接使用cv2.imwrite()会导致乱码问题,可以通过改用cv2.imencode()方法来解决。
1250 0
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
|
计算机视觉 Python
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
使用OpenCV库将一个文件夹内的所有彩色图片批量转换为灰度图,并提供了相应的Python代码示例。
351 0
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
|
计算机视觉 Python
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
这篇博客介绍了如何使用OpenCV库在Python中将图片保存到指定目录,以及如何将文件夹中的所有图片读取并以数组形式输出。
1192 0
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
|
存储 编解码 API
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
2192 1
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
2654 1
|
计算机视觉
使用QT显示OpenCV读取的图片
使用QT显示OpenCV读取的图片
520 1
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
718 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。
1010 0

推荐镜像

更多
  • qt