qt 中 QImage 类的使用 -计算机视觉 with OpenCV 3 and Qt 5

       Qt 中,与图像处理最为相关的就属 QImage 类了。QImage 类不仅可以对图片进行像素级的访问,同时也提供了很多处理图像数据的其它方法。本节我们主要探讨 QImage 的构造函数及其它常用函数,尤其是与 OpenCV 相关的内容。

       QImage 提供了诸多构造函数,允许从文件,原始数据以及空图像构造出QImage。例如:

QImage image (320, 240 QImage::Format_RGB888);
       这个构造函数创建了一张大小为320 * 240 像素的标准 RGB 图像。其中,QImage::Format_RGB888表示8位RGB图像,在此可以指定其它图像类型,例如8位灰阶图像为QImage::Format_Grayscale8。图像的大小也可以用QSize指定:

QImage image(QSize(320, 240),QImage::Format_RGB888);
     下面是从 OpenCV Mat 类型转换到 QImage 类型的一种推荐方法:

Mat mat = imread("c:/dev/test.jpg"); 
cvtColor(mat, mat, CV_BGR2RGB); 
QImage image(mat.data, 
             mat.cols, 
             mat.rows, 
             mat.step, 
             QImage::Format_RGB888); 
      因为OpenCV中默认采用的是BRG类型,所以需要cvtColor函数进行转换。如果忽略此函数,则会导致红蓝通道反转的错误图片。此外,推荐加入bytesPerLine(mat.step)参数,可以避免Mat中数据非连续储存造成的图像错位。

    此外,也可以利用QImage直接读入图片格式文件:

QImage image("c:/image.png");
      QImage 支持读入的文件类型有:BMP, GIF, JPG, JPEG, PNG, PBN, PGM, PPM, XBM, XPM。

      QImage 还有一些其它的常用成员函数:

allGray : 判断一张图片是否是灰度图像(每一像素的RGB值是否相等。

bits constBits (bits的const版本) :用来读取图像数据,一个典型应用是将QImage类型转换为Mat类型:

QImage image("c:/dev/test.jpg"); 
image = image.convertToFormat(QImage::Format_RGB888); 
Mat mat = Mat(image.height(), 
              image.width(), 
              CV_8UC(3), 
              image.bits(), 
              image.bytesPerLine()); 
      convertToFormat 确保 image 转换为标准RGB格式。需要注意的是上述两种 Mat 与 QImage 互转的方式是内存共享的(只是传递指针),意味着如果再转后改变了Mat的原始数据,QImage 也会随之改变。这种方法极大地提高了转换速度,但是在编程时需要十分小心。 如果你确定想要一份不同的数据,可以使用 Mat 的 clone 函数和 QImage 的 copy 函数进行深度拷贝。

byteCount:返回图像数据所占字节数。

bytesPerLine:与Mat类的step属性相似,表示图像每一行的字节数。

converToFormat:转换图片格式。

copy:进行部分或全部的深拷贝。

fill:用一种颜色填充图像的所有像素。

load,loadFromData,fromData:从磁盘或者数据缓存中读取图像。

rgbSwapped:在不改变实际图像数据的条件下,交换红蓝通道。在显示Mat类型时十分有用。

save:将图片保存成文件。

scaled, scaledToHeight, and scakedToWidth:改变图像尺寸,图像的比例可以由下列参数指定:

Qt::IgnoreAspectRatio
Qt::KeepAspectRatio
Qt::KeepAspectRatioByExpanding
setPixelsetPixelColor :设置某一像素的颜色。

transformed:变换图像,该函数需要一个QMatrix或QTransfrom类,返回值为QImage。

QImage image("c:/dev/test.jpg"); 
QTransform trans; 
trans.rotate(45); 
image = image.transformed(trans); 



 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值