• OpenCV入门2:OpenCV中的图像表示


    本文主要讲解opencv中图像的表示。

    在OpenCV中,cv::Mat是用于表示图像和矩阵数据的核心类。它是一个多维数组,可以用来存储像素值、矩阵数据或其他数值数据。

    以下是cv::Mat在OpenCV中的定义:

    1. class CV_EXPORTS Mat
    2. {
    3. public:
    4.     // 构造函数
    5.     Mat();
    6.     Mat(int rows, int cols, int type);
    7.     Mat(Size size, int type);
    8.     Mat(int rows, int cols, int type, void* data, size_t step = AUTO_STEP);
    9.     Mat(Size size, int type, void* data, size_t step = AUTO_STEP);
    10.     Mat(const Mat& m);
    11.     // 成员变量
    12.     int flags; // 属性标记位
    13.     int dims;  // 维度
    14.     int rows;  // 行数
    15.     int cols;  // 列数
    16.     uchar* data;  // 指向数据的指针
    17.     size_t step;  // 步长
    18.     // 函数成员
    19.     Mat& operator=(const Mat& m);
    20.     Mat clone() const;
    21.     void create(int rows, int cols, int type);
    22.     void release();
    23.     void copyTo(Mat& m) const;
    24.     uchar* ptr(int i = 0);
    25.     const uchar* ptr(int i = 0) const;
    26.     // 其他函数...
    27. };

    cv::Mat的几个主要成员变量如下:

    - flags:表示矩阵或图像的属性标志位。例如用于指示矩阵是否连续存储、数据的数据类型等。

    - dims:表示数据的维度。可以是1、2、3等。

    - rows表示矩阵的行数。

    - cols表示矩阵的列数。

    - data:指向图像或矩阵数据的指针。

    - step:表示每个维度的步长(在一维连续存储情况下,步长为每个元素的字节大小)。

    - refcount:引用计数,用于多个cv::Mat对象共享相同数据时进行管理。

    cv::Mat还包含了一些成员函数,例如赋值运算符operator=、创建矩阵的create()函数、释放矩阵的release()函数、复制矩阵的copyTo()函数等。

    元素的数据类型type:

    cv::Mat的每个元素代表图像或矩阵中的一个像素或数值。元素的类型和含义取决于构建cv::Mat对象时使用的数据类型。以下是几种常见的数据类型及其相应的含义:

    - CV_8U:8位无符号整数(0-255),用于表示灰度图像或颜色图像的各个通道颜色强度。

    - CV_8S:8位有符号整数(-128~127),用于表示一些特殊情况下的数据(如深度图像)。

    - CV_16U:16位无符号整数(0-65535),常用于表示深度图像。

    - CV_16S:16位有符号整数(-32768~32767),用于表示一些特殊情况下的数据(如深度图像)。

    - CV_32F:32位浮点数,常用于表示图像的像素强度、特征向量等。

    - CV_64F:64位浮点数,常用于表示双精度浮点矩阵。

    cv::Mat的元素可以通过访问其每个像素的行、列和通道来进行读取和修改。

    图像的每个像素都由一个或多个通道组成,常见的是灰度图像(单通道)和彩色图像(三通道,如BGR格式)。

    例如,对于一个3通道的彩色图像,可以通过cv::Mat对象的行索引、列索引和通道索引来访问和修改图像的像素值。例如,mat.at(i, j)[2]表示访问第i行、第j列的像素的红色通道值。

    1. 在上述定义中,cv::Mat包含了一系列构造函数用于以不同方式创建矩阵。以下是cv::Mat的基本使用方法:

    在OpenCV中,创建cv::Mat图像对象的方式有多种。以下列举一些常见的方式,并提供相应的示例代码:

    1.创建图像:

    • 创建空白图像:
    cv::Mat image; // 创建一个空白图像
    • 指定大小和通道数创建空白图像:
    1. int rows = 480; // 图像高度
    2. int cols = 640; // 图像宽度
    3. int channels = 3; // 图像通道数
    4. cv::Mat image(rows, cols, CV_8UC3); // 创建指定大小和通道数的空白图像
    • 从文件中读取图像:
    cv::Mat image = cv::imread("image.jpg"); // 从文件中读取图像
    • 创建指定数值的图像:
    1. int rows = 480; // 图像高度
    2. int cols = 640; // 图像宽度
    3. int value = 128; // 像素值
    4. cv::Mat image(rows, cols, CV_8UC1, cv::Scalar(value)); // 创建指定大小和像素值的灰度图像
    • 复制已有图像:
    1. cv::Mat srcImage = cv::imread("src.jpg"); // 读取源图像
    2. cv::Mat dstImage;
    3. srcImage.copyTo(dstImage); // 复制图像
    • 创建与已有图像具有相同属性的图像:
    1. cv::Mat srcImage = cv::imread("src.jpg"); // 读取源图像
    2. cv::Mat dstImage(srcImage.size(), srcImage.type()); // 创建具有相同大小和数据类型的图像

    这只是一些创建cv::Mat图像对象的常见方式,读者可以根据实际需求灵活使用。无论是创建空白图像还是从文件中读取图像,都可以通过cv::Mat来进行图像处理和操作。

    2.访问像素值:

    1. cv::Vec3b pixel = image.at(y, x); // 获取指定像素处的像素值
    2. unsigned char r = pixel[2]; // 获取红色通道的像素值

    3.修改像素值:

    image.at(y, x) = cv::Vec3b(255, 0, 0); // 设置指定像素处的像素值为蓝色

    4.获取图像属性:

    1. int width = image.cols; // 获取图像宽度(列数)
    2. int height = image.rows; // 获取图像高度(行数)
    3. int channels = image.channels(); // 获取图像通道数
    4. int depth = image.depth(); // 获取图像数据类型(位深度)

    5.显示图像:

    1. cv::imshow("image", image); // 显示图像窗口
    2. cv::waitKey(0); // 等待按键,0表示无限等待

    需要注意的是,OpenCV中的图像坐标系的原点通常在左上角,x轴向右增长,y轴向下增长。

    这些是OpenCV中图像表示的基本数据结构以及使用方法。你可以通过创建cv::Mat对象来表示和操作图像,使用.at()方法来访问和修改像素值。

  • 相关阅读:
    Creo9.0 特征的成组
    DDOS和CC攻击区别,哪种对服务器伤害大
    面试别问我 微服务架构优缺点?
    AutoTrain:在Google Colab上微调LLM最简单的方法
    三相和单相智能微型断路器功能有区别吗?
    洛谷bfs题2---P1825 [USACO11OPEN] Corn Maze S
    SUSE 助力某头部基金公司 PaaS 平台建设
    WordPress主题开发(六)之—— 模版文件和自定义模板进阶
    Java利用AOP切面编程实现数据分页
    线上问题:如何在静态方法中使用自动装配的对象(通过@PostConstruct初始化对象)
  • 原文地址:https://blog.csdn.net/eric41050808/article/details/134232050