前言
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;
}
这篇文章对你有帮助的话就点个赞吧~文章来源:https://www.toymoban.com/news/detail-584078.html
点赞收藏关注就是对我最大的支持~文章来源地址https://www.toymoban.com/news/detail-584078.html
到了这里,关于Mat与QImage互相转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!