OPENCV的MAT类详解.doc
《OPENCV的MAT类详解.doc》由会员分享,可在线阅读,更多相关《OPENCV的MAT类详解.doc(16页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、|类 Mat 导言OpenCV c + + n 维稠密数组类类 CV_EXPORTS Matpublic:/ / 很多的方法./*!包括几位字段:-神奇的签名-连续性标志-深度(Note :应该是位深)-通道数*/int flags;(Note :目前还不知道 flags 做什么用的)/!数组的维数, = 2int dims ;/!行和列的数量或 (-1,-1) 此时数组已超过 2 维int rows,cols;/!指向数据的指针uchar *data ;/!指针的引用计数器 ;/ / 阵列指向用户分配的数据时,当指针为 NULLint * refcount ;/ / 其他成员.;Mat 类表
2、示一个 n 维的密集数值单通道或多通道数组。它可以用于存储实数或复数值的向量和矩阵、灰度或彩色图像、体素、向量场、点云、张量、直方图 (尽管较高维的直方图存储在 SparseMat 可能更好)。M 数组的数据布局是由阵列 M.step定义的,使元素的地址(i 0,。 iM.dims-1),其中 0 =M.stepi+1 (事实上,M.stepi =M.stepi+1*M.sizei+1)。这意味着 2 维矩阵是按行存储的,3 维矩阵是由平面存储,以此类推。M.stepM.dims-1 是最小的而且总是等于元素大小 M.elemSize()。因此,Mat 中的数据布局完全兼容 OpenCV 1.
3、x 中 CvMat、 IplImage、 CvMatND 类型。它也和标准工具包和 SDK,如Numpy(ndarray),Win32(独立设备位图) 等主流的密集数组类型相兼容,也就是说,与任何使用步进(或步长)来计算像素位置的阵列相兼容。由于这种兼容性,使用户分配的数据创建 Mat 头以及用 OpenCV 函数实时处理该头成为可能。有很多不同的方法,创建一个 Mat 的对象。下面列出了最常见的选项:使用 create(nrows,ncols,type)方法或类似的 Mat(nrows,ncols,type ,fillValue)构造函数。一个新的指定了大小和类型的数组被分配。type 和
4、cvCreateMat 方法中的type 参数具有相同的含义。例如, CV_8UC1 是指一个 8 位单通道阵列,CV_32FC2 指 2 通道(复)浮点阵列,以此类推。/创建一个用 1+3j 填充的 7 x 7 复矩阵。Mat M(7,7,CV_32FC2,Scalar(1,3) ;/ /现在将 M 转换为 100 x 60 的 CV_8UC(15)的矩阵。/ / 旧内容将会被释放M.create(100,60,CV_8UC(15) ;这一章导言中指出,当当前的数组与指定的数组的形状或类型 create() 分配唯一的新数组时的形状或类型。创建多维数组:/ / 创建 100 x 100 x
5、100 8 位数组int sz = 100, 100, 100;Mat. bigCube (3,sz,CV_8U,Scalar:all(0) ;它将维度数(= 1)传递给 Mat 的构造函数,但列数设置为 1 时,创建数组将是 2 维的。因此,Mat:dims 始终是=2 的( 该数组为空时,也可以是 0)。使用的复制构造函数或赋值运算符可以是一个数组或右侧的表达式(请参阅下图)。正像在导言中指出的,数组赋值运算复杂度是 O(1)因为当你需要它的时候,它仅复制头和增加引用计数。Mat:clone() 方法可用于获取全(深)的副本数组。为另一个数组的一部分构建头。它可以是单个行、 单个列,几个行
6、,几个列,矩形区域(代数中称为较小值) 的数组或对角线。这种操作也是复杂度为 O(1),因为,新头引用相同的数据。实际上,您可以使用此特性修改该数组的一部分例如:/ /第 5 行,乘以 3,加到第 3 行,M.row(3) = M.row(3) + M.row (5) * 3 ;/ / 现在将第 7 列复制到第 1 列|/ / M.col(1) = M.col(7) ;/ / 这个不能实现。Mat M1= M.col(1) ;M.col(7).copyTo(M1) ;/ / 创建一种新的 320 x 240 图像Mat img(Size(320,240),CV_8UC3) ;/ / 选择 RO
7、I(region of interest)Mat roi(img,Rect(10,10,100,100) ;/ / 填充 (0,255,0 ) 的 ROI (这是 RGB 空间中的绿色);/ / 320 x 240 原始图像将被修改。roi = Scalar(0,255,0) ;由于额外的 datastart 和 dataend 的成员,它们使得用 locateROI() 计算子数组在主容器数组中的相对的位置成为可能:Mat A = Mat:eye ( 10, 10, CV_32S);/ / 提取 A 的 1 (含)到 3 (不包含)列。Mat B = A(Range:all(),Range(
8、1,3 ) ;/ / 提取 B 的 5 (含)到 9 (不包含)行。/ /即 C A(Range(5,9 ),Range (1,3 )Mat C = B(Range(5,9),Range:all() ;Size size;Point ofs;C.locateROI ( size,ofs);/ / size 将变为 (width= 10, height= 10),ofs 会变为 (x = 1,y = 5)考虑到整个矩阵,如果您需要深层副本,使用子矩阵的 sclone() 方法的提取。为用户分配数据创建矩阵头。有利于执行下列操作:1. 使用 OpenCV 处理“外来“的数据(例如,当您执行 Dir
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OPENCV MAT 详解
限制150内