opencv中Mat的数据定义为指向uchar 的指针,而构造函数又提供了许多其他类型 5

opencv中Mat的数据定义为指向uchar的指针,而构造函数又提供了许多其他类型,是不是矛盾,其内部又是图和实现的?如果这样,提供其他他类型数据,data的指针就会改... opencv中Mat的数据定义为指向uchar 的指针,而构造函数又提供了许多其他类型,是不是矛盾,其内部又是图和实现的?如果这样,提供其他他类型数据,data 的指针就会改变,不如设计成模板类型呀? 展开
 我来答
gookinglee
推荐于2017-05-17
知道答主
回答量:2
采纳率:100%
帮助的人:1584
展开全部
这个问题说细了需要自己去看opencv的源代码,只要有c++的基础,应该都能看懂,这里按我的理解简单回答一下:
其实数据在内存中是一维存储的,而图像基本结构是二维的,3D图像还会是三维的;同时,彩色图像还有多个channel(通道);为了便于编程使用,opencv对一维数据进行矩阵的抽象封装,这个就是Mat类;Mat是一个基础类,封装了构造函数,重载运算符和基础的运算函数(很多类似于matlab的函数);Mat_<tp>类就是利用模板类型继承于Mat,所以opencv是有模板类型的,就是Mat_<tp>。

不管是什么类型,Mat类中的data成员是一个unsigned char *,指向数据的第一个字节(同时还定义了datastart,dataend等,参看源代码),当你使用高级类型的getMat().data函数获得该对象的数据时,可以通过强制转换访问来获得你的数据类型比如我想看float类型图像的第[3,5]像素点的值,可以:((float *)data)[5*width+3]来访问,这样的访问比较原始。一般opencv core里面提供的算法是输入是InputArray和OutputArray;这两个和Mat有很大的关系,void * 就是指向Mat对象,同时加入了一些flag来判断Mat的类型比如是不是img等
追问
明白怎访问,如何处理,就是纳闷,自己设置的成员对象是指向uchar的指针,而自己又提供了许多不是uchar的初始化函数,自己矛盾
追答
不矛盾吧,你是只用Mat吗?只用Mat的话,比如存一张10*10像素的单通道float图像,图像数据总共10*10*4*1字节,data指向第一个字节;Mat本身还有一个成员 int type;这个就是来记录Mat的数据类型;什么CV_32F等
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式