欢迎访问宙启技术站
智能推送

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中对图像进行处理变得更加简单易用。