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

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

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

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

class CV_EXPORTS Mat
{
public:
    // 构造函数
    Mat();
    Mat(int rows, int cols, int type);
    Mat(Size size, int type);
    Mat(int rows, int cols, int type, void* data, size_t step = AUTO_STEP);
    Mat(Size size, int type, void* data, size_t step = AUTO_STEP);
    Mat(const Mat& m);

    // 成员变量
    int flags; // 属性标记位
    int dims;  // 维度
    int rows;  // 行数
    int cols;  // 列数
    uchar* data;  // 指向数据的指针
    size_t step;  // 步长

    // 函数成员
    Mat& operator=(const Mat& m);
    Mat clone() const;
    void create(int rows, int cols, int type);
    void release();
    void copyTo(Mat& m) const;
    uchar* ptr(int i = 0);
    const uchar* ptr(int i = 0) const;

    // 其他函数...

};

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; // 创建一个空白图像
  • 指定大小和通道数创建空白图像:
int rows = 480; // 图像高度

int cols = 640; // 图像宽度

int channels = 3; // 图像通道数

cv::Mat image(rows, cols, CV_8UC3); // 创建指定大小和通道数的空白图像
  • 从文件中读取图像:
cv::Mat image = cv::imread("image.jpg"); // 从文件中读取图像
  • 创建指定数值的图像:
int rows = 480; // 图像高度

int cols = 640; // 图像宽度

int value = 128; // 像素值

cv::Mat image(rows, cols, CV_8UC1, cv::Scalar(value)); // 创建指定大小和像素值的灰度图像
  • 复制已有图像:
cv::Mat srcImage = cv::imread("src.jpg"); // 读取源图像

cv::Mat dstImage;

srcImage.copyTo(dstImage); // 复制图像
  • 创建与已有图像具有相同属性的图像:
cv::Mat srcImage = cv::imread("src.jpg"); // 读取源图像

cv::Mat dstImage(srcImage.size(), srcImage.type()); // 创建具有相同大小和数据类型的图像

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

2.访问像素值:

cv::Vec3b pixel = image.at(y, x); // 获取指定像素处的像素值

unsigned char r = pixel[2]; // 获取红色通道的像素值

3.修改像素值:

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

4.获取图像属性:

int width = image.cols; // 获取图像宽度(列数)

int height = image.rows; // 获取图像高度(行数)

int channels = image.channels(); // 获取图像通道数

int depth = image.depth(); // 获取图像数据类型(位深度)

5.显示图像:

cv::imshow("image", image); // 显示图像窗口

cv::waitKey(0); // 等待按键,0表示无限等待

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

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

你可能感兴趣的:(OpenCV,opencv,计算机视觉)