Mat与QImage互相转换

这篇具有很好参考价值的文章主要介绍了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;
}

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

点赞收藏关注就是对我最大的支持~文章来源地址https://www.toymoban.com/news/detail-584078.html

到了这里,关于Mat与QImage互相转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT使用QImage做图片切割

    这里我使用的是深拷贝,什么叫深拷贝你们可以自行百度一下,我把一张图片平均分成了四份,你们可以按照你们自己的需求更改代码.主要就是: test.png就是原图

    2024年02月10日
    浏览(33)
  • Qt QImage 显示TIFF格式图片

    一,需求 利用Qt 控件 显示 tiff 图片,由于tiff图像深度位96位,3通道,所以无法直接用QImage 显示,QImage 支持24位,因此需要利用Opencv 进行转换。 二,关键点 (1),96位 深度需要利用 IMREAD_UNCHANGED 模式进行加载 (2),加载后进行 规一化,然后进行位深 转换,将32f 转成8

    2024年02月15日
    浏览(36)
  • [pyqt5]opencv QPixmap QImage相互转换

    提前约定: pixmap是QPixmap类型的变量 image是QImage类型的变量 QPixmap=QImage image = pixmap.toImage() QImage=QPixmap pixmap=QPixmap.fromImage(image) Opencv=Qimage 方法一: 方法二 方法三(推荐): Qimage=Opencv QPixmap=Opencv Opencv=QPixmap 可以现将Opencv转Qimage,然后把Qimage转Qpixmap

    2024年02月12日
    浏览(42)
  • QT QImage读取与写入保存图像-图像镜像显示

    QT QImage读取与写入保存图像-图像镜像显示   cpp文件

    2024年02月11日
    浏览(38)
  • QT图像处理类QImage常见使用方法

    Qt 是一个跨平台的 C++ 库,提供了丰富的图像处理功能,可以用来实现各种图像处理任务,例如图像缩放、旋转、灰度化、二值化等。本文将介绍使用 Qt 实现图像处理的方法,并提供代码示例。 在 Qt 中,可以使用 QImage 类型来加载和保存图像,QImage 支持多种图像格式,例如

    2024年02月03日
    浏览(66)
  • pyqt5 QImage QPixmap Opencv图像 相互转换

    只需要加上一行 QPixmap.fromImage(qimage) 即可 只需要加上一行 qimage = qpixmap.toImage() # 转为Qimage 即可

    2024年04月09日
    浏览(47)
  • Qt QPixmap QImage 图片等比例缩放到指定大小

    改变窗口组件的情况下改变窗口背景图片的大小,QImage、QPixmap等绘图设备类都提供scaled()函数。  scaled函数: scaled(const QSize size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const   第一个参数代表缩放后的尺寸   第二个

    2024年01月25日
    浏览(34)
  • linux+QT+FFmpeg 6.0,把多个QImage组合成一个视频

    我这里是专门搞了个类封装,我把这个类当成线程使用了,在启动程序的时候直接当线程启动recordInit():比如这样  然后我在需要合成视频的时候先调用初始化: 再传入QImage: 这样就不会造成卡死主线程的情况 我在使用FFmpeg的时候主要出现两个比较明显的情况: 1.pix_fmt为-1的情况

    2024年02月11日
    浏览(29)
  • QT使用QImage制作图片的四种(圆形,六边形,复古与负片)效果(测试过效果的代码)

    负片效果: 复古效果:   裁剪成圆形   裁剪成六边形:  

    2024年02月13日
    浏览(28)
  • Opencv 基本操作四 指针数组、vector与Mat之间的相互转换 | Mat切片成Vector<mat>并还原

    在深度学习模型部署中通常存在读取图像为mat,然后将mat转换为float指针传入模型的操作。为了快捷开发,因此对指针数组、vector与Mat之间的相互转换进行整理。实现了指针数组、vector之间的相互转换;vector与Mat之间的相互转换(含单通道图像和多通道图像)。vector转mat主要

    2024年02月08日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包