QT中对Mat类的一些操作详解

QT中对Mat类的一些操作详解

Mat类简介

Mat类是OpenCV图像处理库中常用的一个类,它可以用来存储图像数据信息,并提供了很多对图像进行操作的方法。在QT中,可以使用OpenCV库中的Mat类来进行图像处理操作。

Mat类的创建与初始化

Mat类提供了很多构造函数,可以根据不同的参数来创建不同的Mat对象。下面是一些常用的构造函数:

// 创建一个空的Mat对象
Mat M;
// 创建一个指定行数、列数、数据类型的Mat对象
Mat M(int rows, int cols, int type);
// 创建一个与给定的Mat对象拥有相同大小和类型的Mat对象
Mat M(const Mat& m);
// 使用给定的行列数、数据类型和指针创建Mat对象
Mat M(int rows, int cols, int type, void* data, size_t step = AUTO_STEP);
// 使用给定的行列数、数据类型的数字数组创建Mat对象
Mat M(int rows, int cols, int type, const Scalar& s);

需要注意的是,如果使用第四个构造函数创建Mat对象,需要自行分配内存。而如果使用第五个构造函数创建Mat对象,并不是所有的数据类型都可以使用Scalar类型进行初始化。例如,当数据类型为CV_8UC1时,必须使用Scalar(255)来初始化。

Mat类的基本使用

获取Mat对象的像素值

Mat类提供了at()方法可以使用像素点的坐标获取该像素点的值。该方法有两种形式:

// 获取指定行列坐标的像素值
Vec3b at(int y, int x) const;
// 获取指定点的像素值
Vec3b at(Point pt) const;

需要注意的是,获取像素值时,行列索引是从0开始的。而返回的像素值是采用向量类型的,可以通过[]操作符进行访问。

示例:

// 创建一个3*3的图像
Mat img(3, 3, CV_8UC3, Scalar(0, 0, 255));
// 获取第一行第二列的像素值
Vec3b pixel = img.at(0, 1);

// 输出像素值
qDebug() << "B:" << pixel[0] << " G:" << pixel[1] << " R:" << pixel[2];

输出结果:

B: 0 G: 0 R: 255

修改Mat对象的像素值

上面介绍了如何获取Mat对象的像素值,同样可以使用at()方法来修改Mat对象的像素值。需要注意的是,Mat对象的每个像素点可以由一个标量或一个向量类型的值来表示。而且向量类型的值必须与Mat对象的数据类型一致。

// 修改指定行列坐标的像素值
Vec3b& at(int y, int x);
// 修改指定点的像素值
Vec3b& at(Point pt);

示例:

// 创建一个3*3的图像
Mat img(3, 3, CV_8UC3, Scalar(0, 0, 255));
// 获取第一行第二列的像素值
Vec3b& pixel = img.at(0, 1);

// 修改像素值
pixel[0] = 255;
pixel[1] = 0;
pixel[2] = 0;

// 输出像素值
qDebug() << "B:" << pixel[0] << " G:" << pixel[1] << " R:" << pixel[2];

输出结果:

B: 255 G: 0 R: 0

总结

在QT中,使用OpenCV中的Mat类可以方便地对图像进行处理。本文介绍了Mat类的创建与初始化方法,以及获取和修改Mat对象的像素值的方法。Mat类的使用还包括很多其他常用的操作,例如图像几何变换、图像过滤等。如有需要,可以参考官方文档进行深入学习。

示例

void showMatInfo(const cv::Mat& mat) {
    qDebug() << "Mat rows: " << mat.rows;
    qDebug() << "Mat cols: " << mat.cols;
    qDebug() << "Mat type: " << mat.type();
    qDebug() << "Mat channel: " << mat.channels();

    if (mat.channels() == 1) {
        qDebug() << "Mat depth: " << mat.depth();
    } else {
        qDebug() << "Mat depth: " << mat.depth() << ", depth of each channel:" << mat.elemSize1();
    }
}

void matConvertToQImage(cv::Mat srcImage, QImage& destImage) {
    // 确定目标QImage的格式
    const int colorChannel = srcImage.channels();
    switch (colorChannel) {
    case 1:
        destImage = QImage(srcImage.cols, srcImage.rows, QImage::Format_Indexed8);
        break;
    case 3:
        destImage = QImage(srcImage.cols, srcImage.rows, QImage::Format_RGB888);
        break;
    default:
        break;
    }

    // 使用memcpy将Mat数据拷贝到QImage中
    uchar *pSrc = srcImage.data;
    uchar *pDest = destImage.bits();
    int srcLineBytes = srcImage.step;
    int destLineBytes = destImage.bytesPerLine();
    const int lineHeight = srcImage.rows;
    const int pixelBytes = colorChannel * sizeof(uchar);

    for (int i = 0; i < lineHeight; i++) {
        // 逐行拷贝
        memcpy(pDest, pSrc, pixelBytes * srcImage.cols);

        // 指针移动到下一行
        pSrc += srcLineBytes;
        pDest += destLineBytes;
    }
}

void example() {
    // 读取一张图像
    cv::Mat srcImage = cv::imread("example.png");

    // 显示一些图片信息
    showMatInfo(srcImage);

    // 对图像进行处理...
    cv::Mat blurryImage;
    cv::GaussianBlur(srcImage, blurryImage, cv::Size(5, 5), 0);

    // 将OpenCV图像转换成QImage
    QImage destImage;
    matConvertToQImage(blurryImage, destImage);

    // 显示QImage
    QLabel* label = new QLabel;
    label->setPixmap(QPixmap::fromImage(destImage));
    label->show();
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:QT中对Mat类的一些操作详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • vscode 配置 C/C++编译环境(完整教程)

    下面是“vscode配置C/C++编译环境(完整教程)”的完整攻略: 一、安装vscode和MinGW-w64 1.安装vscode vscode是一款非常流行的编辑器,使用非常方便,可以在官网 https://code.visualstudio.com/ 下载最新版的安装包进行安装。安装完成后,打开vscode,在左侧菜单栏中搜索并安装“C/C++”插件。…

    C 2023年5月23日
    00
  • 基于matlab MFCC+GMM的安全事件声学检测系统

    让我来详细讲解“基于matlab MFCC+GMM的安全事件声学检测系统”的完整攻略。 系统描述 这是一个基于matlab MFCC+GMM的安全事件声学检测系统,用于监听环境中的声音信号并根据特征对其进行分类,以检测是否存在安全事件。系统主要包含以下三个模块: 数据预处理模块:对原始音频进行文件读取、降噪、滤波、抽取特征等预处理 特征提取模块:使用MFCC…

    C 2023年5月24日
    00
  • 逍遥自在学C语言 | 位运算符^的高级用法

    前言 在上一篇文章中,我们介绍了|运算符的高级用法,本篇文章,我们将介绍^ 运算符的一些高级用法。 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、交换两个变量的值 #include <stdio.h> int main() { int a = 10; in…

    C语言 2023年4月17日
    00
  • Linux环境使用g++编译C++方法总结

    关于“Linux环境使用g++编译C++方法总结”的攻略,我们可以按照以下步骤进行: 一、安装g++ 首先需要在Linux环境中安装g++,g++是GNU C++编译器的套件,也是GNU Compiler Collection(GCC)的一部分。安装方法如下: 1. 使用apt-get安装 运行以下命令安装g++: sudo apt-get update s…

    C 2023年5月23日
    00
  • C语言深度解剖篇之关键字以及补充内容

    C语言深度解剖篇之关键字以及补充内容 介绍 在C语言中,关键字具有特殊含义,是编译器中预定义的标识符。在编写程序时,需要注意不能使用关键字作为变量名或函数名,否则会导致编译错误。 常用关键字 下面是一些常见的C语言关键字: auto: 声明自动变量 break: 中断当前循环语句或switch语句 const: 声明常量,值不能被修改 continue: 继…

    C 2023年5月22日
    00
  • C语言实现职工工资管理系统的示例代码

    下面是对于“C语言实现职工工资管理系统的示例代码”的完整攻略,包含了过程、示例说明以及代码实现: 1. 需求分析 该工资管理系统主要包括以下功能: 录入职工信息 查询职工信息 删除职工信息 修改职工信息 计算职工工资 根据上述需求,我们可以将职工信息抽象为一个结构体,包括工号、姓名、性别、年龄、基本工资等成员变量。通过调用各种函数实现各项功能,并将所有信息存…

    C 2023年5月23日
    00
  • 简单谈谈C++ 中指针与引用

    下面是关于C++中指针与引用的详细讲解: 指针与引用简介 在C++中,指针和引用都属于变量地址的概念,它们可以被用来实现对变量的间接访问。指针是一个变量,存储着另一个变量的地址,而引用则是一个别名,是被引用变量的另一个名称。 指针和引用都是C++中重要的概念,尤其是在使用函数传参和动态内存分配时,它们常被使用。 指针的使用 在C++中,可以使用指针来实现对另…

    C 2023年5月23日
    00
  • Linux中文件系统truncate.c详解

    Linux中文件系统truncate.c详解 什么是truncate.c文件 truncate.c文件是Linux内核中负责处理文件截断操作的核心文件。其主要功能是截断指定文件的长度,可以对文件进行缩短或扩展。在Linux系统的文件系统中,文件截断操作是文件的常用操作之一。 truncate.c文件操作示例 1. 文件截断操作 truncate.c文件主要包…

    C 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部