OPENCV CV类

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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值