Mat 的一些基本的初始化

本文详细介绍了 OpenCV 中 Mat 类的不同初始化方式,包括指定尺寸和类型进行初始化、从已有数据源初始化以及从图像文件初始化等,并展示了每种方式的具体代码实现及输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文讲解Mat 的一些基本的初始化

// m为3*5的矩阵,float型的单通道,把每个点都初始化为1
Mat m(3, 5, CV_32FC1, 1);
或者 Mat m(3, 5, CV_32FC1, Scalar(1));
cout<<m;
输出为:
[1, 1, 1, 1, 1;
  1, 1, 1, 1, 1;
  1, 1, 1, 1, 1]

// m为3*5的矩阵,float型的2通道,把每个点都初始化为1 2
 Mat m(3, 5, CV_32FC2, Scalar(1, 2));
cout<<m;
输出为
[1, 2, 1, 2, 1, 2, 1, 2, 1, 2;
  1, 2, 1, 2, 1, 2, 1, 2, 1, 2;
  1, 2, 1, 2, 1, 2, 1, 2, 1, 2]

// m为3*5的矩阵,float型的3通道,把每个点都初始化为1 2 3
Mat m(3, 5, CV_32FC3, Scalar(1, 2, 3));
cout << m;
输出为
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3;
  1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3;
  1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]

// 从已有的数据源初始化
double *data = new double[15];
for (int i = 0; i < 15; i++)
{
   data[i] = 1.2;
}
Mat m(3, 5, CV_32FC1, data);
cout << m;
输出为:
[1.2, 1.2, 1.2, 1.2, 1.2;
  1.2, 1.2, 1.2, 1.2, 1.2;
  1.2, 1.2, 1.2, 1.2, 1.2]

如果接着
delete [] data;
cout << m;
输出为:
[-1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144;
  -1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144;
  -1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144]
可见,这里只是进行了浅拷贝,当数据源不在的时候,Mat里的数据也就是乱码了。

// 从图像初始化 
 Mat m = imread("1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
 cout<< "channels ="<<m.channels()<<endl;
 cout << "cols ="<<m.cols<<endl;
 cout << "rows ="<<m.rows<<endl;
 cout << m;
输出为:
channels =1
cols =13
rows =12
[179, 173, 175, 189, 173, 163, 148, 190, 68, 14, 19, 31, 22;
  172, 172, 172, 180, 172, 177, 162, 190, 64, 13, 19, 30, 17;
  177, 180, 176, 175, 169, 184, 165, 181, 58, 12, 23, 38, 25;
  181, 183, 178, 178, 170, 181, 163, 182, 52, 8, 23, 37, 23;
  176, 173, 173, 184, 175, 178, 164, 195, 60, 14, 24, 35, 16;
  179, 175, 176, 187, 176, 175, 158, 191, 70, 21, 28, 37, 20;
  182, 183, 180, 184, 174, 179, 155, 174, 54, 1, 5, 15, 2;
  173, 182, 178, 176, 173, 191, 165, 169, 157, 101, 100, 107, 93;
  181, 182, 180, 177, 177, 177, 171, 162, 183, 185, 186, 185, 182;
  178, 180, 179, 177, 178, 179, 174, 167, 172, 174, 175, 174, 172;
  175, 178, 179, 178, 180, 182, 179, 173, 172, 174, 175, 175, 174;
  175, 179, 181, 180, 181, 183, 181, 177, 178, 180, 182, 183, 182]

<think>好的,用户想了解如何初始化OpenCV中的Mat对象。首先,我需要回忆一下OpenCV里Mat基本概念。Mat是OpenCV中用来存储图像和矩阵数据的主要数据结构,初始化方法有很多种,用户可能需要知道不同的场景下应该用哪种方法。 首先,用户可能是个刚开始学习OpenCV的新手,所以需要从基础的方法讲起。比如使用构造函数直接指定行数、列数、类型和初始值。然后,zeros和ones方法也很常用,特别是创建全零或全一的矩阵,这在图像处理中初始化时很常见。 接下来,用户可能还需要知道如何创建特定大小的矩阵,比如eye方法生成单位矩阵,这在某些算法中会用到。另外,复制现有Mat对象也是一个常见需求,这时候可以用clone或copyTo方法,这时候需要解释两者的区别,比如深拷贝和浅拷贝的问题。 还有,用户可能会需要从数组或向量初始化Mat,这在数据处理时很实用。比如用给定的数组数据创建Mat,或者用STL的vector来初始化。这时候需要注意数据的类型和维度是否正确。 另外,用户可能不太清楚不同的初始化方法的应用场景,所以需要给出每种方法的典型使用例子。比如处理图像时,创建全零矩阵作为掩膜,或者生成单位矩阵进行矩阵运算。 需要检查是否有遗漏的初始化方法,比如使用create方法重新分配内存,或者使用Scalar来设置特定颜色值。还要注意Mat的数据类型,比如CV_8UC3对应三通道的uchar类型,这在图像处理中很常见,而CV_64F是双精度浮点型,用于数值计算。 可能用户会遇到初始化时参数顺序的问题,比如行数在前还是列数在前,需要明确指出Mat的构造函数是行(rows)、列(cols)、类型。此外,初始化时如果类型不匹配可能会导致错误,需要提醒用户注意数据类型的选择。 最后,是否需要提到Mat对象的默认构造函数?比如声明一个Mat变量但不立即初始化,之后通过其他方法分配内存。这可能在某些情况下有用,但用户的问题主要是初始化,所以可能不需要深入讨论。 总结一下,回答的结构应该先介绍Mat的作用,然后分点列出不同的初始化方法,每种方法给出代码示例和说明,最后可能总结一下选择方法的依据。需要确保示例代码正确,比如使用正确的语法,比如Mat::zeros的正确调用方式,以及注意中文注释的添加,帮助用户理解每行代码的作用。</think>在OpenCV中,`cv::Mat`是存储图像和矩阵数据的核心类。初始化`cv::Mat`的常见方法如下,按使用场景分类说明: --- ### **1. 构造函数直接初始化** ```cpp // 创建3行4列的浮点型矩阵,并初始化为全1.5 cv::Mat mat1(3, 4, CV_32FC1, cv::Scalar(1.5)); // 创建100x200的3通道彩色图像,初始化为蓝色(BGR) cv::Mat img(100, 200, CV_8UC3, cv::Scalar(255, 0, 0)); ``` - `CV_32FC1`: 32位浮点单通道 - `CV_8UC3`: 8位无符号整型三通道 --- ### **2. 特殊矩阵初始化** ```cpp // 全零矩阵(常用于掩膜) cv::Mat zeros = cv::Mat::zeros(3, 3, CV_8UC1); // 全一矩阵(常用于滤波器核) cv::Mat ones = cv::Mat::ones(5, 5, CV_64FC1); // 单位矩阵(用于线性代数运算) cv::Mat eye = cv::Mat::eye(4, 4, CV_32FC1); ``` --- ### **3. 从数组/向量初始化** ```cpp // 通过C/C++数组初始化 float data[6] = {1, 2, 3, 4, 5, 6}; cv::Mat mat2(2, 3, CV_32FC1, data); // 2行3列 // 通过std::vector初始化 std::vector<double> vec = {1.1, 2.2, 3.3}; cv::Mat mat3(vec, true); // 自动转换为列向量(3x1) ``` --- ### **4. 复制现有Mat对象** ```cpp cv::Mat original = cv::Mat::eye(3, 3, CV_32FC1); // 浅拷贝(共享数据) cv::Mat shallowCopy = original; // 深拷贝(独立内存) cv::Mat deepCopy1 = original.clone(); cv::Mat deepCopy2; original.copyTo(deepCopy2); ``` --- ### **5. 动态初始化(延迟分配内存)** ```cpp cv::Mat dynamicMat; dynamicMat.create(300, 400, CV_8UC1); // 分配300x400单通道空间(数据未初始化) ``` --- ### **关键注意事项** 1. **数据类型匹配** 确保初始化时数据类型(如`CV_8U`, `CV_32F`)与操作需求一致,否则可能引发类型转换错误。 2. **维度与通道数** - 图像处理常用二维矩阵(行×列) - 多通道数据(如RGB)通过`CV_8UC3`等类型指定 3. **内存管理** OpenCV使用引用计数自动释放内存,避免手动释放。 --- ### **典型应用场景** - **图像处理**:用`zeros`创建掩膜,`ones`创建滤波器核 - **数值计算**:用`eye`初始化单位矩阵进行矩阵求逆 - **数据转换**:从数组/向量快速导入数据到Mat对象 建议根据具体需求选择初始化方法,优先使用`Mat::zeros/ones/eye`等静态方法保证代码简洁性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值