本文主要讲解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
在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()方法来访问和修改像素值。