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互相转换的主要内容,如果未能解决你的问题,请参考以下文章