opencv常用函数,QT中Mat与QImage的转换

这篇具有很好参考价值的文章主要介绍了opencv常用函数,QT中Mat与QImage的转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、opencv简介

opencv是一个跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上,实现了图像处理和计算机视觉方面的很多通用算法。

二、cv常用函数

1.imread

Mat imread( const String& filename, int flags = IMREAD_COLOR );是从指定文件载入一幅图像

filename:要读入图片的完整路径

flags:读入图片的标志

IMREAD_UNCHANGED = -1,表示读取原图,包括alpha通道, 不进行任何改变

IMREAD_GRAYSCALE = 0,表示以灰度图方式读取原图

IMREAD_COLOR = 1,表示以RGB方式读取原图,忽略alpha通道,默认参数

这里需要注意:读取图片时默认是忽略透明度,打开一个背景颜色为透明的图片时会是黑色。如果想要透明度,使用IMREAD_UNCHANGED = -1参数。

2.imwrite

bool imwrite( const String& filename, InputArray img,const std::vector<int>& params = std::vector<int>());是保存一幅图像到指定的文件中。

filename:所需保存图像的文件目录和文件名。这里的文件名需要带有图像格式后缀的,目前OpenCV该函数只支持JPEG,PNG,PPM,PGM,PBM,TIFF等。并不是所有Mat类型都支持。

img:图像数据来源,其类型为Mat。

3.imdecode

Mat imdecode( InputArray buf, int flags );是从指定的内存缓存中读一幅图像

buf:它是以字节为单位接收到的图像数据

flags:它指定读取图像的方式。默认值为IMREAD_COLOR 同(1)中类型

4.imencode

bool imencode( const String& ext, InputArray img,CV_OUT std::vector<uchar>& buf,const std::vector<int>& params = std::vector<int>());是将一幅图像写进内存缓存中。

ext:定义输出文件格式的扩展名

img:需要被编码的图像

buf:输出的缓存区,类型是vector

parms:被编码的格式和压缩率,类型是vector

prams目前支持以下参数:

JPEG,它的压缩率范围(cv_imwrite_jpeg_quality)从0到100(越大越好)。默认值是95。100为没有压缩。

对于WEBP来说,它的压缩范围(cv_imwrite_webp_quality)从1到100(越大越好)。默认情况下(不含任何参数)和质量在100以上,则使用无损压缩。

png,可以压缩级别(cv_imwrite_png_compression)从0到9。更高的值意味着更小的尺寸和更长的压缩时间。默认值是3。

PPM、PGM、或PBM,它可以是一个二进制格式的标志(cv_imwrite_pxm_binary),0或1。默认值是1。

5.cvtColor

void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );

src:输入图像即要进行颜色空间变换的原图像,可以是Mat类

dst:输出图像即进行颜色空间变换后存储图像,也可以Mat类

code:转换的代码或标识,表示图像转码方式 ,比如:CV_BGR2RGB

dstCn:目标图像通道数,如果取值为0,则由src和code决定

三、Mat常用构造函数

1.Mat::Mat()

无参数构造方法

2.Mat::Mat(int rows, int cols, int type)

创建行数为 rows,列数为 col,类型为 type 的图像

3.Mat::Mat(Size size, int type)

创建大小为 size,类型为 type 的图像

Size(cols,rows)在Size()的构造函数中行数和列数在是反过来的

4.Mat::Mat(int rows, int cols, int type, const Scalar& s)

创建行数为 rows,列数为 col,类型为 type 的图像,并将所有元素初始化为值 s

5.Mat::Mat(Size size, int type, const Scalar& s)

创建大小为 size,类型为 type 的图像,并将所有元素初始化为值 s

6.Mat::Mat(const Mat& m)

将m赋值给新创建的对象,此处不会对图像数据进行复制,m和新对象共用图像数据,属于浅拷贝

四、类似“CV_8UC3”的含义

1.8U还包括{8U,16S,16U,32S,32U,32F}多种类别。

U:无符号整形  

S:有符号整形

F:单精度浮点型

8U:8位无符号整形 (0~255)

8S:8位符号整形 (-128~127)

16U:16位无符号整形 (0~65535)

16S:16位有符号整形 (-32768~32767)

32S:32位有符号整形 (-2147483648~2147483647)

32F:32位浮点数 (-FLT_MAX ………FLT_MAX,INF,NAN)

64F:64 位浮点数 (-DBL_MAX ……….DBL_MAX,INF,NAN)

例如:CV_32FC2:32位浮点型双通道矩阵

2.C3 还包括{C1,C3,C4}

C:通道,多通道排列顺序为BGR

C1:单通道,灰度图

C3:三通道,BGR图像

C4:四通道,BGRA图像

如果需要更多的通道数,需要用宏 CV_8UC(n)。例如:CV_8UC(6)

五、cv::Mat与QImage的互相转换

1.QImage转cv::Mat

cv::Mat QImageTocvMat(const QImage &image)
{
    cv::Mat mat;
    switch(image.format())
    {
    case QImage::Format_Grayscale8: //灰度图,每个像素点1个字节(8位)
    case QImage::Format_Indexed8: //Mat构造:行数,列数,存储结构,数据,step每行多少字节
                mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
    break;
    case QImage::Format_ARGB32: 
    case QImage::Format_RGB32:
    case QImage::Format_ARGB32_Premultiplied:
                mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
    break;
    case QImage::Format_RGB888: //RR,GG,BB字节顺序存储
                mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
                cv::cvtColor(mat, mat, cv::COLOR_RGB2BGR); //opencv需要转为BGR的字节顺序
        break;
    }
    return mat;
}

2.cv::Mat转QImage

QImage cvMatToQImage(const cv::Mat& mat)
{
    switch (mat.type()) {
    case CV_8UC1:{
        QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);

        image.setColorCount(256);
        for(int i = 0; i < 256; i++){
            image.setColor(i, qRgb(i, i, i));
        }

        uchar *pSrc = mat.data;
        for(int row = 0; row < mat.rows; row ++){
            uchar *pDest = image.scanLine(row);
            memcpy(pDest, pSrc, mat.cols);
            pSrc += mat.step;
        }

        return image;
    }
        break;
    case CV_8UC3:{
        const uchar *pSrc = (const uchar*)mat.data;
        QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);

        return image.rgbSwapped();
    }
        break;
    case CV_8UC4:{
        const uchar *pSrc = (const uchar*)mat.data;
        QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);

        return image.copy();
    }
        break;
    default:
        break;
    }

    return QImage();
}

六、例子

QImage cvMatToQImage(const cv::Mat& mat)
{
    switch (mat.type()) {
    case CV_8UC1:{
        qDebug()<<"CV_8UC1";
        QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);

        image.setColorCount(256);
        for(int i = 0; i < 256; i++){
            image.setColor(i, qRgb(i, i, i));
        }

        uchar *pSrc = mat.data;
        for(int row = 0; row < mat.rows; row ++){
            uchar *pDest = image.scanLine(row);
            memcpy(pDest, pSrc, mat.cols);
            pSrc += mat.step;
        }

        return image;
    }
        break;
    case CV_8UC3:{
        qDebug()<<"CV_8UC3";
        const uchar *pSrc = (const uchar*)mat.data;
        QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);

        return image.rgbSwapped();
    }
        break;
    case CV_8UC4:{
        qDebug()<<"CV_8UC4";
        const uchar *pSrc = (const uchar*)mat.data;
        QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);

        return image.copy();
    }
        break;
    default:
        break;
    }

    return QImage();
}

void MainWindow::on_pushButton_clicked()
{
    QString img_name = QFileDialog::getOpenFileName( this, tr("Open Image"), ".", tr("Image Files(*.png *.jpg *.jpeg *.bmp)"));
    cv::Mat src = cv::imread(img_name.toStdString(),-1);

    QPixmap video = QPixmap::fromImage(cvMatToQImage(src));

    ui->label->resize( video.size());
    ui->label->setPixmap( video);
}

注意:之前用imread函数读取图片时,没有写后面的枚举值,用的默认值1,默认不读取透明度,结果读出来的背景透明色的图片背景都是黑色的,找了好几天原因。网上的例子都是没有写默认值的,读出来的图片都是没有问题的,一度怀疑自己。结果是这个默认值的问题,写-1的话是读取透明度的,网上例子没有问题是因为读取的图片背景颜色不是透明的,不涉及到透明度问题。文章来源地址https://www.toymoban.com/news/detail-766786.html

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

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

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

相关文章

  • QT使用QImage做图片切割

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

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

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

    2024年02月15日
    浏览(43)
  • [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日
    浏览(47)
  • QT QImage读取与写入保存图像-图像镜像显示

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

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

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

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

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

    2024年04月09日
    浏览(57)
  • 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日
    浏览(44)
  • linux+QT+FFmpeg 6.0,把多个QImage组合成一个视频

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

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

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

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

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

    2024年02月08日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包