首页 > 其他分享 >QT中常见QImage、Pixmap、Mat三种图像格式的转换

QT中常见QImage、Pixmap、Mat三种图像格式的转换

时间:2024-07-18 14:27:13浏览次数:18  
标签:Pixmap 图像格式 QT image Util Mat QPixmap QImage mat

写在前面

        暑假实习参与了单位的QT项目开发,在过程中遇见了一些困扰以及解决方式,在此记录下来

常见图像格式之间的转换

        我将他们都封装在了一个类中,代码见下

#ifndef UTIL_H
#define UTIL_H
#include"qimage.h"
#include"QPixmap"
#include"opencv2/opencv.hpp"
using namespace cv;
class Util
{
public:
    Util();
    QImage pix2img(QPixmap& p);
    QPixmap img2pix(QImage& p);
    Mat img2mat(QImage& image);
    QImage mat2img(Mat& mat);
    QPixmap mat2pix(Mat& mat);
    Mat pix2mat(QPixmap& p);

};

#endif // UTIL_H
#include "util.h"

Util::Util() {}


QImage Util::pix2img(QPixmap& p)
{
    QImage qImage = p.toImage();
    return qImage;
}
QPixmap Util::img2pix(QImage& p)
{
    QPixmap qPixmap = QPixmap::fromImage(p);
    return qPixmap;
}
Mat Util::img2mat(QImage& image)
{
    cv::Mat mat;
    switch (image.format()) {
    case QImage::Format_RGB32:
        mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
        break;
    case QImage::Format_RGB888:
        mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
        cv::cvtColor(mat, mat, cv::COLOR_RGB2BGR);
        break;
    case QImage::Format_Indexed8:
        mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
        break;
    default:
        throw std::runtime_error("Unsupported QImage format");
    }
    return mat;
}
QImage Util::mat2img(Mat& mat)
{
    switch (mat.type()) {
    case CV_8UC4: {
        QImage image(mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB32);
        return image;
    }
    case CV_8UC3: {
        QImage image(mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
        return image.rgbSwapped(); // BGR to RGB
    }
    case CV_8UC1: {
        QImage image(mat.data, mat.cols, mat.rows, mat.step, QImage::Format_Indexed8);
        return image;
    }
    default:
        throw std::runtime_error("Unsupported cv::Mat format");
    }
}
QPixmap Util::mat2pix(Mat& mat)
{
    QImage image = mat2img(mat);
    QPixmap pixmap = QPixmap::fromImage(image);
    return pixmap;
}
Mat Util::pix2mat(QPixmap& p)
{
    QImage image = p.toImage();
    cv::Mat mat = img2mat(image);
    return mat;
}

目前仅支持的图像格式

Format_RGB32

32位RGB图像,每个像素用4字节表示(B、G、R、A),顺序为0xBBGGRRAA

Format_RGB888

24位RGB图像,每个像素用3字节表示(B、G、R),顺序为B、G、R

Format_Indexed8

8位索引图像,每个像素是一个8位的索引,查找颜色表来获得实际颜色

以上均为常见的图像格式,若有修改,自己补充即可,新人笔记,如果有错误,烦请指出

标签:Pixmap,图像格式,QT,image,Util,Mat,QPixmap,QImage,mat
From: https://blog.csdn.net/m0_73369548/article/details/140521599

相关文章

  • qtchooser -install qt6 $(which qmake6)
    qtchooser-installqt6$(whichqmake6)https://askubuntu.com/questions/1460242/ubuntu-22-04-with-qt6-qmake-could-not-find-a-qt-installation-of InUbuntu22.04afterinstalling Qt6 usingsudoaptinstallqt6-base-devcalling qmake resultsinaner......
  • Qt实现仪表盘-自定义控件
            仪表盘在很多汽车和物联网相关的系统中很常用,本文就来介绍一下Qt 仪表盘的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。一、简述         使用Qt绘制一个仪表盘,用来显示当前的温度,绘制刻度、绘制数字......
  • QT利用QPainter实现自定义圆弧进度条组件
               在可视化应用中,弧形进度条应用也比较广泛,本文示例封装了一个可复用、个性化的弧形进度条组件。本文示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。主要结构就是外围一圈圆角进度,中间加上标题和对应进度的百分比,进度条的起始角......
  • 【Qt】探索Qt框架:开发经典贪吃蛇游戏的全过程与实践
    文章目录引言项目链接:1.Qt框架的使用简介2.贪吃蛇游戏设计2.1游戏规则和玩法介绍2.2游戏界面设计概述3.核心代码解析3.1主界面(GameHall)3.1.1布局和功能介绍3.1.2代码实现分析3.2游戏选择界面(GameSelect)3.2.1功能介绍3.2.2代码实现分析3.3游戏房间(GameRoom......
  • 【QT开发】串口通信管理QSerialPort类详解及实战应用
    QSerialPort是Qt提供的一个功能强大、简单易用的串口通信类。通过本文的学习,您应该对QSerialPort的基本使用、高级应用技巧及相关注意事项有了全面的理解。在实际项目中,QSerialPort可以帮助实现与外部设备的串口通信,确保数据的可靠传输和接收。希望本文能帮助您更好地......
  • QTimer的一个莫名错误
    该错误很莫名奇妙,暂时也不知道为什么会出错。是这样的,我自定义了一个QThread,在run函数中会循环打开一个资源,这个资源会出现打不开的情况,所以如果打开失败,就需要等待一段时间再次去打开。因为中间有可能手动终端等待,手动触发再次尝试打开资源,所以没有直接使用msleep,搞的比较复杂。......
  • Qt处理中文编码出现错误
    Qt的QString使用起来非常方便,内部封装了很多很好用的函数和功能。其中有个函数是simplified(),这个函数可以除去字符串的首尾和内部的空白(空白包括\t,\n,\v,\f,\r,'')。其中Qt帮助文档中说的是移除的ASCII中的\t,\n,\v,\f,\r,''。这里隐藏着一个坑。如果字符串不是完全的ASCII字符......
  • Qt - QtWebEngineWidgets模块
    1、QtWebEngineWidgets模块 #include<QtWebEngineWidgets>QT+=webenginewidgets 1.1QWebEnginePage示例代码:#include<QtWebEngineWidgets>#include<QWebEnginePage>//1、创建一个新的QWebEnginePage实例:page=newQWebEnginePage(this);......
  • mqtt mosquitto开源库实现
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、MQTT是什么?二、使用步骤1.服务器配置安装并开启mosquitto2.客户端代码总结前言提示:这里可以添加本文要记录的大概内容:mosquitto开源库实现简单的mqtt发布和订阅功能程序。提示:......
  • 钡铼Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP、OPC UA分布式IO系统BL20X系列耦
    BL20X系列耦合器是钡铼技术开发的一款用于分布式I/O系统的设备,专为工业环境下的高速数据传输和远程设备控制而设计,支持多种工业以太网协议,包括Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP和OPCUA等。如果您正在考虑部署BL20X系列耦合器又不知选择哪款,那不妨来看一看钡铼......