Mat与QImage互相转换

5 篇文章 1 订阅

前言

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;
}

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

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

  • 15
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值