前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mat基本元素的表达与读写

Mat基本元素的表达与读写

作者头像
OpenCV学堂
发布2019-11-13 10:36:49
7640
发布2019-11-13 10:36:49
举报

早期的OpenCV使用IplImage和CvMat数据结构来表示图像。OpenCV 2.0引入了C++类Mat来管理图像数据(矩阵)。

矩阵元素的表达

对于单通道图像,元素类型一般为8U,也可以是16S、32F等,它们可以直接用uchar、short、float等C/C++的基本数据类型表达。

对于多通道图像,如果仍然将图像视作二维矩阵,矩阵元素就不再是基本数据类型。此时可以将OpenCV中表示向量的模板类Vec用于表达矩阵元素。例如:

typedefVec<uchar2> Vec2b

typedefVec<uchar, 3> Vec3b

typedefVec<uchar, 4> Vec4b

typedefVec<float, 2> Vec2f

typedefVec<float, 3> Vec2f

typedefVec<float, 4> Vec4f

对于Vec对象,可以使用[]符号如操作数组般读写其元素:

矩阵元素的读写

at()函数

函数at()可以读取或赋值矩阵的某个元素。

需要注意的是,并不推荐使用at() 函数来遍历图像。这个函数的优点是代码的可读性高,但是其效率并不高。

迭代器

C++ STL库的迭代器(iterator)可以方便地遍历矩阵的所有元素。

数据指针

也可以通过C/C++中的指针操作来访问矩阵元素。

用指针操作来访问像素是非常高效的。若程序的运行速度是一个重要指标,建议遍历像素时使用指针,但是务必十分小心。C/C++ 中的指针操作是不进行类型以及越界检查的,如果指针访问出错,程序运行时有时候可能看上去一切正常,有时候却会突然弹出“段错误”(segment faultsegment fault)。所以,如果对指针使用没有自信,不建议直接通过指针操作来访问矩阵元素。虽然 at() 函数和迭代器也不能保证对像素访问进行充分的检查,但是总是比指针操作要可靠一些。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档