QT中对Mat类的一些操作详解
发布时间:2023-05-14 18:15:52
Qt提供了对OpenCV库的支持,对Mat类进行了封装,使得在Qt中使用Mat类变得更加简单方便。Mat类是OpenCV中最基本、最常用的类之一,它代表了一个二维矩阵,可以存储各种类型的数据,如图像、特征向量等。
在Qt中,可以使用cv::Mat或QMat类代替opencv中的Mat类。QMat继承了cv::Mat,可以与Qt的图像显示系统很好地结合使用。
下面是对QMat类常用操作的一些详细介绍:
1. 创建和初始化
在Qt中创建和初始化QMat类非常简单。可以使用Mat构造函数来创建矩阵,也可以使用create和zeros函数初始化矩阵。
以创建3行4列的单通道8位深度的灰度图像为例:
QMat img(3, 4, CV_8UC1); // 用构造函数创建
img.create(3, 4, CV_8UC1); // 直接创建
img = cv::Mat::zeros(3, 4, CV_8UC1); // 用函数创建并初始化
2. 转换
在Qt中,可以将QMat对象存储的数据转换为QImage对象、QPixmap对象或Mat对象。
将QMat转换为QImage:
QImage image(img.data, img.cols, img.rows, img.step, QImage::Format_Grayscale8);
将QMat转换为Mat:
cv::Mat mat = img;
3. 复制和裁剪
在Qt中,可以使用copyTo函数将一个QMat对象复制到另一个QMat对象中。如果只想复制矩阵的一部分,可以使用Mat的范围功能。
QMat img1 = img.clone(); // 复制img到img1
QMat subimg = img1(Rect(1, 1, 2, 2)); // 从img1中裁剪一个2x2的矩阵
4. 赋值和交换
在Qt中可以使用等号运算符将一个QMat对象赋值给另一个。另外,也可以使用swap函数将两个QMat对象交换数据。
QMat img2;
img2 = img1; // 将img1赋值给img2
img1.swap(img2); // 交换img1和img2的数据
5. 缩放和旋转
在Qt中,可以使用resize函数对QMat对象进行缩放操作,可以使用rotate函数对QMat对象进行旋转操作。
cv::resize(img1, img2, cv::Size(6, 8)); // 将img1缩放到6x8的大小,并存储到img2中
cv::rotate(img2, img2, cv::ROTATE_90_CLOCKWISE); // 将img2逆时针旋转90度
6. 图像操作
在Qt中,可以直接使用OpenCV库中的函数对QMat对象进行各种图像处理操作。比如可以使用cv::Canny函数对图像进行边缘检测。
cv::Canny(img1, img2, 50, 150); // 对img1进行边缘检测,并存储到img2中
以上就是常用QMat操作的简单介绍,Qt对OpenCV库的支持使得在Qt中对图像进行处理变得更加简单易用。
