当前位置: 代码迷 >> 综合 >> Mat 类型转 QImage 类型
  详细解决方案

Mat 类型转 QImage 类型

热度:12   发布时间:2023-12-25 19:40:12.0

转自:https://blog.csdn.net/liyuanbhu/article/details/86307283

void Dialog::Mat2QImage(Mat image)
{
    //图片的显示主要问题还是在于QImage与Mat格式的不同,其中QImage是RGB排列,而Mat 是 BGR,//同时两者格式包含的内容页不同,因此需要经过转换才能够显示。Mat rgb;QImage img;//salt(image ,100000);// colorReduce(image,64);if(image.channels()==3){
    //cvt Mat BGR 2 QImage RGBcvtColor(image,rgb,CV_BGR2RGB);img =QImage((const unsigned char*)(rgb.data),rgb.cols,rgb.rows,rgb.cols*rgb.channels(),QImage::Format_RGB888);}else{
    img =QImage((const unsigned char*)(image.data),image.cols,image.rows,image.cols*image.channels(),QImage::Format_RGB888);}//ui->label->setPixmap(QPixmap::fromImage(img)); //QImage转换为QPixmap//ui->label->resize(ui->label->pixmap()->size());QImage imgScaled ;//默认保持原图的宽高比 以label大小为大小imgScaled = img.scaled(ui->label->size(),Qt::KeepAspectRatio);ui->label->setPixmap(QPixmap::fromImage(imgScaled));
}

或是:

/**************************************************************************** ** file: convert.h ** brief: cv::Mat 与 QImage 之间的转换函数。在 Qt 程序中使用 OpenCV 时有用。 ** Copyright (C) LiYuan ** Author: LiYuan ** E-Mail: 18069211#qq(.)com ** Version 2.0.1 ** Last modified: 2019.01.11 ** Modified By: LiYuan ****************************************************************************/#ifndef QT_OPENCV_CONVERT_H
#define QT_OPENCV_CONVERT_H#include <QtCore/QDebug>
#include <QtGui/QImage>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/opencv.hpp"
/*** @brief 将 OpenCV 的 cv::Mat 类型图像转换为 QImage 类型* @param mat 待转换的图像,支持 CV_8UC1、CV_8UC3、CV_8UC4 三种OpenCV 的数据类型* @param clone true 表示与 Mat 不共享内存,更改生成的 mat 不会影响原始图像,false 则会与 mat 共享内存* @param rb_swap 只针对 CV_8UC3 格式,如果 true 则会调换 R 与 B RGB->BGR,如果共享内存的话原始图像也会发生变化* @return 转换后的 QImage 图像 */
QImage cvMat2QImage(const cv::Mat& mat, bool clone = true, bool rb_swap = true);/*** @brief 将 QImage 的类型图像转换为 cv::Mat 类型* @param image 待转换的图像,支持 Format_Indexed8/Format_Grayscale、24 位彩色、32 位彩色格式,* @param clone true 表示与 QImage 不共享内存,更改生成的 mat 不会影响原始图像,false 则会与 QImage 共享内存* @param rg_swap 只针对 RGB888 格式,如果 true 则会调换 R 与 B RGB->BGR,如果共享内存的话原始图像也会发生变化* @return 转换后的 cv::Mat 图像 */
cv::Mat QImage2cvMat(QImage &image, bool clone = false, bool rb_swap = true);#endif
/**************************************************************************** ** file: convert.cpp ** brief: cv::Mat 与 QImage 之间的转换函数。在 Qt 程序中使用 OpenCV 时有用。 ** Copyright (C) LiYuan ** Author: LiYuan ** E-Mail: 18069211#qq(.)com ** Version 2.0.1 ** Last modified: 2019.01.11 ** Modified By: LiYuan ****************************************************************************/#include "convert.h"QImage cvMat2QImage(const cv::Mat& mat, bool clone, bool rb_swap)
{
    const uchar *pSrc = (const uchar*)mat.data;// 8-bits unsigned, NO. OF CHANNELS = 1if(mat.type() == CV_8UC1){
    //QImage image(mat.cols, mat.rows, QImage::Format_Grayscale8);QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_Grayscale8);if(clone) return image.copy();return image;}// 8-bits unsigned, NO. OF CHANNELS = 3else if(mat.type() == CV_8UC3){
    // Create QImage with same dimensions as input MatQImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);if(clone){
    if(rb_swap) return image.rgbSwapped();return image.copy();}else{
    if(rb_swap){
    cv::cvtColor(mat, mat, CV_BGR2RGB);}return image;}}else if(mat.type() == CV_8UC4){
    qDebug() << "CV_8UC4";QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);if(clone) return image.copy();return image;}else{
    qDebug() << "ERROR: Mat could not be converted to QImage.";return QImage();}
}cv::Mat QImage2cvMat(QImage &image, bool clone, bool rb_swap)
{
    cv::Mat mat;//qDebug() << image.format();switch(image.format()){
    case QImage::Format_ARGB32:case QImage::Format_RGB32:case QImage::Format_ARGB32_Premultiplied:mat = cv::Mat(image.height(), image.width(), CV_8UC4,(void *)image.constBits(), image.bytesPerLine());if(clone)  mat = mat.clone();break;case QImage::Format_RGB888:mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void *)image.constBits(), image.bytesPerLine());if(clone)  mat = mat.clone();if(rb_swap) cv::cvtColor(mat, mat, CV_BGR2RGB);break;case QImage::Format_Indexed8:case QImage::Format_Grayscale8:mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void *)image.bits(), image.bytesPerLine());if(clone)  mat = mat.clone();break;}return mat;
}

文本框 lineEdit 获取的值与数字互转
在这里插入图片描述