在QT中,与机器视觉最相关的类可能就是QImage了,QImage是QT中处理图像数据最主要的类,他提供了很多处理图像的函数。而在opencv中,数据存储格式为Mat,Mat取义于matrix,是一个用于存储处理不同数据类型的n维矩阵。举例来说,在机器视觉中,一张图片就是一个由像素组成的二维矩阵,它具有宽(列数)、高(行数)和通道数,每一个位置对应于一个像素强度(灰度图)或多个像素强度(彩色图)。
直观理解,如下:
将图像中一个图像块放大,就可以得到第二个图像。
一、Mat的构造函数
1、 要创建一个r行,c列,数据格式为F的矩阵M,可以采用:
Mat M(r, c, F, Scalar(0));
这里,Scalar(0)表示将矩阵M初始化为0,而F的格式可以为:
CV_C()
bits表示位数,可以为:
8: 无符号或有符号整数
16: 无符号或有符号整数
32: 无符号或有符号整数和浮点数
64: 无符号或有符号的浮点数
type表示数据类型,可以为:
U: 无符号整形
S: 有符号整形
F: 有符号的浮点型
channels表示通道数,如果为图像,一般为1或者3
常见的图像格式有:
CV_8U : 8-bit unsigned integers
CV_8S : 8-bit signed integers
CV_16U : 16-bit unsigned integers
CV_16S : 16-bit signed integers
CV_32S : 32-bit signed integers
CV_32F : 32-bit floating-point numbers
CV_64F : 64-bit floating-point numbers
2、还可以采用create接口来进行构造:
Mat M;
M.create(r, c, F, Scalar(0));
3、使用Mat::zeros和Mat::ones来构造:
Mat M = Mat::zeros(r, c, F);
// Mat M = Mat::ones(r, c, F);
4、使用size来构造:
Mat M(Size(r, c), F);
二、Mat的ROI选取
1、使用Rect选取:
Mat roi(image,Rect(25,25,50,50));
2、使用rowRange和colRange:
Mat M1 = image.rowRange(image.rows/2 - 10, image.rows/2 + 10);
Mat M2 = image.colRange(image.cols/2 - 10, image.cols/2 + 10);
三、Mat的复制
clone和copyTo
Mat imageCopy = image.clone();
src.copyTo(dst, mask);
四、QImage的构造函数
1、给定图像大小和格式,创建一个空的QImage对象:
QImage image(320, 240, QImage::Format_RGB888);
2、还可以通过QSize代替直接赋值:
QImage image(QSize(320,240), QImage::Format_RGB888);
五、opencv中Mat类型与QImage类型之间转换
因为opencv中默认图像通道顺序为BGR,而Qt中默认图像颜色通道为RGB,因此转换过程中,需要对通道顺序进行调整:
1、彩色图像对应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);
其中cvtColor是opencv提供用于转换Mat类型数据颜色通道的函数,还可以用来将BGR图像转换成HSV,Gray等格式。
2、 还可以使用QImage的rgbSwapped()属性,直接对RGB三通道进行交换。
cv::Mat mat = cv::imread("c:/dev/test.jpg");
QImage image(mat.data,
mat.cols,
mat.rows,
mat.step,
QImage::Format_RGB888);
ui->label->setPixmap(QPixmap::fromImage(image.rgbSwapped()));
参考资料:
Computer Vision with OpenCV 3 and Qt5