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
setPixel 和
setPixelColor :设置某一像素的颜色。
transformed:变换图像,该函数需要一个QMatrix或QTransfrom类,返回值为QImage。
QImage image("c:/dev/test.jpg");
QTransform trans;
trans.rotate(45);
image = image.transformed(trans);