OPENCVMat类存取方法元素访问

上传人:无*** 文档编号:96358343 上传时间:2022-05-25 格式:DOC 页数:16 大小:467KB
收藏 版权申诉 举报 下载
OPENCVMat类存取方法元素访问_第1页
第1页 / 共16页
OPENCVMat类存取方法元素访问_第2页
第2页 / 共16页
OPENCVMat类存取方法元素访问_第3页
第3页 / 共16页
资源描述:

《OPENCVMat类存取方法元素访问》由会员分享,可在线阅读,更多相关《OPENCVMat类存取方法元素访问(16页珍藏版)》请在装配图网上搜索。

1、Opencv-Mat 类 cv:Matdepth/dims/cha nn els/step/data/elemSizeMat矩阵中数据元素的地址计算公式:addr(MiO,ii,i-1)= M.data + M.step0 * i 0 + M.step1 * i 1 + + M.stepm-1 * i m-i。其中 m二M.dims是指M的维度i. data: Mat对象中的一个指针,指向内存中存放矩阵数据的一块内存(uchar*data).ii. row: 行;col:歹U; rows: 行数;cols: 列数。iii. dims :Mat所代表的矩阵的维度,如 3 * 4的矩阵为2维,3

2、* 4 * 5的为3维.iv. channels通道,矩阵中的每一个矩阵元素拥有的值的个数,比如说 3 * 4矩阵中一共12个元素,如果每个元素有三个值,那么就说这个矩阵是3通道的,即channels = 3。常见的是一张彩色图片有红、绿、蓝三个通道。但是 opencv用imread (opencv读图的函数)读进来的图像,三通道存放顺序为B、G、Rov. depth:深度,即每一个像素的位数(bits),在opencv的Mat.depth()中得到的是一个0 - 6的数字,分别代表不同的位数:enum CV_8U=0, CV_8S=1,CV_16U=2, CV_16S=3, CV_32S=4

3、, CV_32F=5, CV_64F=6 ; 可见 0和 1 都代表8位,2和3都代表16位, 4和5代表32位, 6代表64位;vi. step:是一个数组,定义了矩阵的布局,具体见下面图片分析,另外注意step1(step / elemSizel), M.stepm-1总是等于 elemSize M.stepl(i)返回的是第 i 维的步长,因此 M.stepl(m-I)总是等于channels m是M的维度;这里是解 释步长stepk的,步长也可以看作是与第k维的存储单位,在2维的矩阵中, 因为存储是按照行的顺序存储的,整个矩阵存储为一个平面,所以第k=0维的步长也就是单位肯定就是一行所

4、占的字节数;如果是3维的话,第0维是按照面为单位来存储的,第1维是按照行为单位来存储的,第2维是按照元素类 型为单位存储的,每个元素类型是基本类型(即uchar,float,short等等)与通道数 的乘积;也就是基本数据类型与通道数组成元素,多个元素组成了行,多行组成了面,多个面组成了 3维体,多个3维体 组成4维超体。以此类推,如 此看来某一维的步长应该等于高一维的步长step*低一维的大小size。vii.elemSize :矩阵中每一个元素的数据大小,如果是n通道,就是(n*数据类型)。 如果Mat中的数据的数据类型是 CV_8U那么elemSize = 1,CV_8UC3那么 ele

5、mSize = 3, CV_16UC2 那么 elemSize = 4;记住另外有个 elemSize1 表示的是矩阵中数据类型的大小,即elemSize / channels的大小。图片分析1考虑二维情况(stored row by roW按行存储M.step(U :每一笫一维度的第二维度的单位长度(在 这里是每一行的列的大小即一个元素的大小uchar1,上面是一个3 X 4的矩阵,假设其数据类型为 CV_8U,也就是单通道的类型*这是一个二维矩阵,那么维度为2 ( M.dims = 2);* M.rows = 3; M.cols = 4 ;* sizeof(uchar) = 1,那么每一个

6、数据元素大小为1 ( M.elemSize()=M.elemSize1() = 1);* CV_8U 得到 M.depth() = 0, M.channels() = 1;因为是二维矩阵,那么step数组只有两个值,stepO和step1分别代表一行的数据大小和一个元素的数据大小,贝U M.stepO = 4, M.step1=1; M.stepl(O) = M.cols = 4; M.step1(1) = 1;假设上面的矩阵数据类型是CV_8UC3,也就是三通道 M.dims = 2; M.channels() = 3; M.depth() = 0; M.elemSize() = 3 (每一

7、个元素包含 3个 uchar值) M.elemSize1() = 1(elemSize / cha nn els M.step0 = M.cols * M.elemSize() = 12, M.step1 = M.cha nn els() *M.elemSize1() = M.elemSize() = 3; M.step(O) = M.cols * M.cha nn els() = 12 ; M.step(1) = M.cha nn els() = 3;图片分析2:考虑三维情况(stored plane by plane按面存储遂的k小ht&poj:山j的人小M.data + M.stepO

8、* 0+ M.stepl * 1+ M.step2 * 2上面是一个3 X 4 X 6的矩阵,假设其数据类型为 CV_16SC4,也就是short类型* M.dims = 3 ; M.cha nn els() = 4 ; M.elemSize1() = sizeof(short) = 2 ;* M.rows = M.cols = ;* M.elemSize() = M.elemSize1() * M.cha nn els() = M.stepM.dims-1=M.step2 = 2 * 4 = 8; M.step0 = 4 * 6 * M.elemSize() = 192 ;* M.step1

9、 = 6 * M.elemSize() = 48 ;* M.step2 = M.elemSize() = 8 ; M.stepl(O) = M.stepO / M.elemSize() = 48 / 2 = 96 (第一维度(即面的元素个数)*通道数); M.step1(1) = M.step1 / M.elemSize() = 12 / 2 = 24(第二维度(即行的元素个数/列宽)*通道数); M.step1(2) = M.step2 / M.elemSize() = M.channels() = 4 (第三维度(即元素)*通道数);End以上为Mat的存放形式以下为Mat的一些操作方法F

10、n 1 :利用 step。Code 1:具体使用方法int mai n()/新建一个uchar类型的单通道矩阵(grayscale image灰度图)Mat m(400, 400, CV_8U, Scalar(O);for ( int col = 0; col 400; col+)for ( int row = 195; row inline _Tp& Mat:at(其中参数有多个,也就是说at函数有多个重载* 返回值为Mat类型,Mat有个索引的重载,也就是符号的重载,用这个 重载可以定位多通道数据,具体示例可以看下面代码。下面的代码把红色通道值大于128的颜色的置为白色,左边为原图,右边为

11、处理 过后的图。Code 2 :int mai n()Mat img = imread(le na.jpg );imshow(Le na Origi nal, img);for ( int row = 0; row img.rows; row+)for ( int col = 0; col img.cols; col+)/*注意Mat:at函数是个模板函数,需要指明参数类型,因为这张图是具有红蓝绿三通道的图,所以它的参数类型可以传递一个Vec3b,这是一个存放3个uchar 数据的Vec(向量).这里提供了索引重载,2表示的是返回第三个通道,在这里是Red通道,第一个通道(Blue)用0返回*

12、/if (img.at(row, col)2 128)img.at(row, col) = Vec3b(255, 255, 255);imshow(Le na Modified, img);cvWaitKey();return 0;亍 LenaCode 3 :Output 2 :这段代码用的是Fn1的方式,效果和 Code 2等价,不过是处理三通道数据而int mai n()Mat img = imread(le na.jpg );imshow(Le na Origi nal, img);for ( int row = 0; row img.rows; row+)for ( int col =

13、 0; col 128)/row, col像素的第1通道地址被*解析(blue 通道)*(img.data + img.step0 * row + img.step1 * col) = 255;/row, col像素的第2通道地址被*解析(green通道),关于elemSize1函数的更多描述请见Fn1里所列的博文链接*(img.data + img.step0 * row + img.step1 * col +img.elemSize1() = 255;/row, col 像素的第3通道地址被*解析(red通道)*(img.data + img.step0 * row + img.step1

14、 * col +img.elemSize1() * 2) = 255;imshow( Le na Modified , img);cvWaitKey();return 0;Output 3 = Output 2Fn 3 :使用Mat的一个模板子类Mat_的()符号重载定位一个像素Code 4 :int mai n()Mat m(400, 400, CV_8UC3, Scalar(255, 255, 255);/ m2 是Mat_ 类型的,因为m中元素的类型是 CV_8UC3,可以用Vec3b 存 储3个通道的值/注意Mat_ 这种写法是错误的,因为CV_8UC3只是一个宏定义/ #defi n

15、e CV_8UC3 CV_MAKETYPE(CV_8U, 3)Mat_ m2 = m;/ for循环画一个红色的实心圆for (int y = 0; y m.rows; y+)for (int x = 0; x m.rows; x+)if (pow( double (x-200), 2) + pow(double (y-200), 2) - 10000.0 0.00000000001)/ Mat_模板类实现了对()的重载,可以定位到一个像素m2(x, y) = Vec3b(0, 0, 255);imshow( Image , m);cvWaitKey();return 0;Output 4 :

16、看上去怎么有点不爽Fn 4 :使用Mat:ptr 模板函数Code 5 :int mai n()Mat m(400, 400, CV_8UC3, Scalar(226, 46, 166); imshow( Before , m);for ( int row = 0; row m.rows; row+)if (row % 5 = 0)/ data是 uchar* 类型的,m.ptr(row)返回第row 行数据的首地/需要注意的是该行数据是按顺序存放的,也就是对于一个3通道的Mat,个像素有有3个通道值,B,G,RB,G,RB,G,R.所以一行长度为:/ sizeof(uchar) * m.co

17、ls * m.cha nn els()个字节uchar* data = m.ptr(row);for ( int col = 0; col m.cols; col+)datacol* 3 = 102; / 第datacol * 3 + 1 = 217;datacol * 3 + 2 = 239;row行的第col个像素点的第一个通道值Blue/ Greenimshow( After,m);cout (int)m.at(0, 0)0 素值到控制台cout (int)m.at(0, 0)1 cout (int)m.at(0, 0)2 endl;cvWaitKey();return 0;/利用Fn 1 介绍的方法输岀一下像/ RedOutput 5 :30 C :Wi ndEnd :Author : Ggicci谢谢阅读,有误希望指正!-Ope nCV 初学者

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!