Mat与QImage互相转换

Posted 龙木南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mat与QImage互相转换相关的知识,希望对你有一定的参考价值。

前言

Mat是opencv中的存储图像的容器,也是图像像素矩阵

QImage是Qt中存储图片常用的类

Qt和opencv经常配合在一起使用,但Qt的函数方法的参数是不接受Mat的,所以如果我们想要在Qt中操作opencv处理后的图像,就必须将Mat转换成QImage

Mat->QImage

Mat转换成QImage,可直接使用QImage的构造函数进行转换,但要注意的是,当Mat类型是CV_8UC3时,因为opencv色彩空间是BGR,Qt默认是RGB,所以需要转换,可以使用opencv中的cvtColor函数或者Qt中的rgbSwapped来进行转换,注意在QImage的生存周期内,必须保证Mat中的数据不会被释放,否则QImage就会失效

解决方法:调用QImage::bits函数复制一份Mat数据,这样Mat释放,QImage也能正常使用

QImage MainWindow::MatToImage(Mat &m) //Mat转QImage

    //判断m的类型,可能是CV_8UC1  CV_8UC2  CV_8UC3  CV_8UC4
    switch(m.type())
     //QIamge 构造函数, ((const uchar *data, 宽(列),高(行), 一行共多少个(字节)通道,宽度*字节数,宏参数)
    case CV_8UC1:
    
        QImage img((uchar *)m.data,m.cols,m.rows,m.cols * 1,QImage::Format_Grayscale8);
        return img;
    
        break;
    case CV_8UC3:   //一个像素点由三个字节组成
    
        //cvtColor(m,m,COLOR_BGR2RGB); BGR转RGB
        QImage img((uchar *)m.data,m.cols,m.rows,m.cols * 3,QImage::Format_RGB888);
        return img.rgbSwapped(); //opencv是BGR  Qt默认是RGB  所以RGB顺序转换
    
        break;
    case CV_8UC4:
    
        QImage img((uchar *)m.data,m.cols,m.rows,m.cols * 4,QImage::Format_RGBA8888);
        return img;
    
        break;
    default:
    
        QImage img; //如果遇到一个图片均不属于这三种,返回一个空的图片
        return img;
    
    

QImage->Mat

QImage转换Mat,可直接使用Mat的构造函数进行转换,通过QImage提供的format函数判断图片类型,分别case不同情况,注意,图片类型远不止这些,这里只是列举常见的灰度图和彩色图类型

Mat MainWindow::ImageToMat(QImage &image) //QImage转Mat

    Mat mat = Mat::zeros(image.height(), image.width(),image.format()); //初始化Mat
    switch(image.format()) //判断image的类型
    
        case QImage::QImage::Format_Grayscale8:  //灰度图
            mat = Mat(image.height(), image.width(),
            CV_8UC1,(void*)image.constBits(),image.bytesPerLine());
            break;
        case QImage::Format_RGB888: //3通道彩色
            mat = Mat(image.height(), image.width(),
                CV_8UC3,(void*)image.constBits(),image.bytesPerLine());
            break;
        case QImage::Format_ARGB32: //4通道彩色
            mat = Mat(image.height(), image.width(),
                CV_8UC4,(void*)image.constBits(),image.bytesPerLine());
            break;
        default:
            return mat;
    
    return mat;

这篇文章对你有帮助的话就点个赞吧~

点赞收藏关注就是对我最大的支持~

以上是关于Mat与QImage互相转换的主要内容,如果未能解决你的问题,请参考以下文章

使用 QImage::loadFromData 将 cv::mat 转换为 QImage

cv::Mat转换为QImage错误

将 cv::mat 转换为 QImage

使用原始数据将 QImage 转换为 cv::Mat

Qimage 到 cv::Mat 转换的奇怪行为

Convert between cv::Mat and QImage 两种图片类转换