OpenCV中Mat结构图像元素的获取

参考文章:http://blog.csdn.net/ljbkiss/article/details/7381208 


文中对比了7种方法

都是针对灰度图的,若对RGB图操作,注意元素排列实际为:B G R的顺序


读入灰度图:imread("img.jpg",0);//0表示读为灰度图,或者用IMREAD_GRAYSCALE


Mat类中有个step数组,step[0]表示图像一行的字节数, step[1]表示每个像素的字节数


文艺做法:(推荐方法)(只能用于彩色图)

float getMatPix(Mat img,int row,int col,int BGR)//B G R:0 1 2
{  
	float *pts = img.ptr<float>(row);  
	return pts[3*col+BGR];
}

暴力做法:(速度更快)(彩色、灰度通用)

float* getMatPix(Mat img,int row,int col)//灰度图
{  
	int step0=img.step[0];
	int step1=img.step[1];
	return (float*)(img.data+row*step0 + col*step1) ;
}





<think>好的,我需要帮助用户了解OpenCVMat类的使用方法和相关问题的解决。首先,我需要整理用户提供的引用内容,这些引用提到了Mat的构造函数、成员函数、静态成员函数以及示例代码。用户可能需要一个结构化的教程,涵盖Mat的基本用法、构造函数、成员函数、示例代码以及常见问题。 首先,我应该按照逻辑顺序组织内容,从Mat的基本概念开始,然后介绍构造函数,接着是成员函数,再提供示例代码,最后解答常见问题。需要确保每个部分都引用合适的参考资料,比如引用[1]提到静态成员函数,引用[3]有示例代码,引用[4]和[5]涉及reshape和Range构造函数。 然后,我需要检查用户提供的引用是否正确对应到相关内容。例如,引用[3]中的代码展示了如何从vector构建Mat对象,引用[5]提到了使用Range的构造函数。需要确保每个知识点都正确引用来源。 接下来,我需要生成相关问题。这些问题应该围绕用户可能遇到的疑问,比如如何创建Mat对象、调整形状、内存共享机制以及常见错误处理。这些问题需要覆盖用户可能的使用场景,帮助他们深入理解Mat类的使用。 最后,要确保回答符合系统级指令,比如使用正确的LaTeX格式,行内公式用$,独立公式用$$,并且引用标识自然添加在段落末尾。同时,回答要使用中文,结构清晰,分点说明,便于用户理解。</think>### OpenCV Mat类使用详解 #### 一、Mat类基础概念 OpenCV的$Mat$类用于存储多维矩阵数据,支持图像、向量、张量等数据类型的存储和计算。其核心特性包括**自动内存管理**和**数据共享机制**,通过引用计数实现高效的内存复用[^1]。 #### 二、构造函数详解 1. **基础构造** 创建空矩阵: ```cpp Mat img; // 空矩阵 ``` 2. **维度构造** 指定行、列、数据类型和初始值: ```cpp Mat mat(480, 640, CV_8UC3, Scalar(0,0,255)); // 创建480x640红色图像 ``` 3. **容器转换构造** 从`std::vector`创建(如引用[3]示例): ```cpp vector<uchar> vec = {1,2,3,4,5,6,7,8,9}; Mat tmp = Mat(vec, 1); // 生成1x9的单通道矩阵 ``` 4. **区域截取构造** 使用`Range`选择子矩阵(如引用[5]): ```cpp Mat roi = original(Range(10,100), Range(20,200)); // 截取10-100行、20-200列区域 ``` #### 三、关键成员函数 1. **形状调整** `reshape()`函数可改变矩阵维度而不复制数据(如引用[4]): ```cpp Mat reshaped = tmp.reshape(3, {3,3}); // 将9元素向量转为3x3三通道矩阵 ``` 2. **数据访问** 使用`ptr()`获取行指针: ```cpp uchar* row_ptr = mat.ptr<uchar>(0); // 获取第0行数据指针 ``` 3. **矩阵克隆** `clone()`实现深拷贝: ```cpp Mat copy = mat.clone(); // 独立内存副本 ``` #### 四、示例应用 1. **图像灰度化** ```cpp Mat rgb_img = imread("input.jpg"); Mat gray_img; cvtColor(rgb_img, gray_img, COLOR_BGR2GRAY); ``` 2. **矩阵运算** 计算矩阵乘法: ```cpp Mat A = Mat::eye(3,3, CV_32F); Mat B = Mat::ones(3,3, CV_32F); Mat C = A * B; // 结果仍为单位矩阵 ``` #### 五、常见问题解决 1. **内存共享问题** 修改子矩阵会直接影响原矩阵: ```cpp Mat sub = mat(Rect(0,0,100,100)); sub.setTo(0); // 原矩阵左上角100x100区域被清零 ``` 2. **空矩阵判断** 使用`empty()`检测构造是否成功(如引用[3]): ```cpp if(tmp.empty()) cout << "矩阵构造失败" << endl; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值