1、cv::Mat
cv::Mat
cv::Mat 是OpenCV库中的一个核心数据结构,代表一个多功能的、用于存储图像或矩阵数据的类。"Mat" 是 "Matrix"(矩阵)的缩写。
cv::Mat matrix(rows, cols, type, data);
//1、rows 和 cols 分别定义了矩阵的行数和列数。它们可以是任意正整数,也可以使用某些特定值(如CV_MAT_CN(type))来自适应大小。
//type 指定了矩阵元素的数据类型。OpenCV中有很多预定义的数据类型,如CV_8UC1(8位无符号单通道)、CV_32FC2(32位浮点数双通道)等。这影响了矩阵中元素如何存储和解释。
//data 是一个可选参数,指向一个包含初始数据的缓冲区。如果提供了这个参数,新创建的cv::Mat对象会尝试从这个缓冲区中初始化数据。如果不提供,矩阵会被默认初始化(通常是零填充)。
//cv::Mat 可以表示三维甚至更高维度的数据
cv::Mat threeDMatrix(10, 10, 10, CV_8UC1);
// 创建一个10x10x10的三维矩阵,元素类型为8位无符号单通道
vector<cv::Mat>
//是C++标准库中的std::vector容器,用于存储cv::Mat对象的集合。这意味着每个元素都是一个独立的cv::Mat实例,可以有不同的尺寸、类型或表示不同的图像帧、特征集合、分割后的图像区域等。使用vector<cv::Mat>允许你以一种有序且动态可调整大小的方式管理多个cv::Mat对象。
mat 位置查看
int main() {
cv::Mat matrix; // 这里声明了一个空的 Mat 对象,但没有进行初始化赋值
matrix = cv::Mat(2, 3, CV_8UC1); // 这是正确的方式来初始化一个 Mat 对象
matrix.setTo(Scalar(58));
cv::Mat myMatrix(2, 3, CV_8UC1); // 这是另一种方式来声明并初始化一个 Mat 对象
cout << "Filled matrix with ones:\n" << static_cast<int>(matrix.at<uchar>(0, 1))<< endl;
//return 0;
}
matrix.at<uchar>(2, 1) 表达的确实是像素值,具体来说是第3行第2列像素的灰度值(如果矩阵是单通道的,如 CV_8UC1 类型)。 现在来解释 static_cast<int> 的作用和区别: matrix.at<uchar>(2, 1) 返回值的类型: matrix.at<uchar>(2, 1) 返回的是一个 uchar 类型的值,即无符号字符类型,范围在0到255之间,代 表像素的灰度值。 static_cast<int> 的作用: static_cast<int>(matrix.at<uchar>(2, 1)) 这个表达式的作用是将 uchar 类型的像素值转换为 int 类型。在 OpenCV 中,通常像素值的范围是 0 到 255,因此 uchar 转换为 int 是安全的,因为 int 类型可以容纳 uchar 类型的所有值。 区别和用途: matrix.at<uchar>(2, 1) 返回的是原始的像素值,类型是 uchar。 static_cast<int>(matrix.at<uchar>(2, 1)) 返回的是将像素值转换为 int 类型后的值。这种转换常用于需要进行数学运算或者打印输出时,因为大多数情况下,我们更习惯处理 int 类型的数据。
1. 动态尺寸:它可以在运行时动态地调整大小,支持任意维度的矩阵(通常是二维或三维,用于图像处理)。
2. 内存管理:自动管理内存,包括内存分配和释放,减少了程序员管理内存的负担。
3. 连续与非连续存储:支持连续内存块存储(利于快速访问)和非连续存储(如子矩阵可以共享父矩阵的内存)。
4. 数据类型灵活性:可以存储不同类型的数据,包括基本的整数、浮点数,甚至是用户自定义的数据类型。
5. 高效操作:内置了大量的图像处理和矩阵运算方法,如像素访问、几何变换、算术运算、色彩空间转换等。
2、cv::dnn::blobFromImage
blobFromImage 是 OpenCV DNN 模块中的一个函数,它用于将输入图像转换为深度学习模型所需的 Blob 格式(一个四维的数组,通常表示为 NCHW,即 Batch Size, Channels, Height, Width)。
3、cv::Rect
cv::Rect 类则代表了一个矩形区域,通常用于指定图像中的“感兴趣区域”(ROI, Region of Interest)。它由四个成员变量定义:x(矩形左上角的列坐标)、y(矩形左上角的行坐标)、width(矩形的宽度)和 height(矩形的高度)。当你需要从一张大图中提取或操作特定区域时,cv::Rect 就显得非常有用。
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 假设我们有之前创建的图像 blackImage
cv::Mat blackImage(3, 3, CV_8UC1, cv::Scalar(0));
// 定义一个感兴趣区域,比如图像的右下角1x1区域
cv::Rect roi(2, 2, 1, 1);
// 提取ROI并修改
cv::Mat corner = blackImage(roi);
corner.at<uchar>(0, 0) = 255; // 修改ROI内像素为白色
return 0;
}
4、cv::Reshape
cv::Mat cv::reshape(const cv::Mat& src, int cn, int rows=0)
//或者
cv::Mat cv::reshape(const cv::MatND& src, int cn, int dim=0, const int* sz=NULL)
//•src: 输入矩阵,即要重塑的原始矩阵。
//•cn: 目标矩阵的通道数(深度)。如果设置为0,则通道数保持不变。
//•rows: 目标矩阵的行数。如果设置为0(默认),函数会尝试计算合适的行数以保持元素总数不变。如果同时指定了cn和rows,那么cols(列数)将被自动计算。
//•dim: (仅在使用cv::MatND版本时有效)指定调整尺寸的维度索引,默认为0。
//•sz: (仅在使用cv::MatND版本时有效)新的尺寸数组。如果不为NULL,它将覆盖除了dim指定的维度之外的所有维度尺寸。
示例:
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 创建一个一维的cv::Mat,模拟一个向量
cv::Mat oneDVector = cv::Mat::ones(12, 1, CV_8U);
// 使用reshape将其转换为3x4的矩阵(保持元素总数不变)
cv::Mat twoDMatrix = oneDVector.reshape(1, 3);
// 这里cn=1表示单通道,3是行数,列数会自动计算以保持元素总数不变
std::cout << "Original shape: " << oneDVector.size() << std::endl;
std::cout << "Reshaped shape: " << twoDMatrix.size() << std::endl;
return 0;
}
4、minMaxLoc
minMaxLoc 是 OpenCV 库中的一个函数,用于在一个数组(通常是单通道的灰度图像或者一维数组)中找到最大值和最小值及其对应的索引位置。
该函数原型如下:
void minMaxLoc(InputArray src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray() )
简单示例:
minMaxLoc(scores, 0, &maxClassScore, 0, &class_id);
•scores: 这是一个单通道的矩阵或向量,通常包含了某个图像或数据对于不同类别的预测分数。比如,在一个深度学习模型的输出层,每个元素代表模型预测该样本属于某一类别的置信度分数。
•0: 第二个参数是 minVal 的位置,但这里传入了 0,意味着我们不关心最小值。这是因为在这个上下文中,我们只关心找到最高得分的类别。
•&maxClassScore: 这是一个指向变量的指针,用来接收最大值,即最高类别得分。minMaxLoc 执行后,maxClassScore 将存储最高的类别得分。
•0: 第四个参数也是指针位置,用于接收最小值对应的索引或位置,但由于我们不关心最小值,所以也传入了 0。
•&class_id: 这是一个指向变量的指针,用来接收最大值对应的位置或索引。在这个上下文中,它将告诉我们哪个类别的预测分数最高,即预测的类别ID。