没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
每次碰到 Mat 都得反复查具体的用法,网上的基础讲解不多,难得看到一篇,赶快转来收
藏~
原文地址:http://www.opencvchina.com/thread103911.html
目标
我们有多种方法可以获得从现实世界的数字图像:数码相机、扫描仪、计算机体层摄影或磁
共振成像就是其中的几种。在每种情况下我们(人类)看到了什么是图像。但是,转换图像
到我们的数字设备时我们的记录是图像的每个点的数值。
例如在上图中你可以看到车的镜子只是一个包含所有强度值的像素点矩阵。现在,我们如何
获取和存储像素值可能根据最适合我们的需要而变化,最终可能减少计算机世界内的所有图
像数值矩阵和一些其他的信息的描述基质本身。OpenCV 是一个计算机视觉库,其主要的工
作是处理和操作,进一步了解这些信息。因此,你需要学习和开始熟悉它的第一件事是理解
OpenCV 是如何存储和处理图像。
Mat
OpenCV 自 2001 年出现以来。在那些日子里库是围绕 C 接口构建的。在那些日子里,他们
使用名为 IplImage C 的结构在内存中存储图像。这是您将在大多数较旧的教程和教材中看到
的那个。使用这个结构的问题是将 C 语言的所有负面效果都摆到了桌面上。最大的问题是
手动管理。它是建立在用户来负责处理内存分配和解除分配的假设之上的。当程序规模较小
时,这是没有问题的,一旦代码基开始变得越来越大它将会越来越挣扎着处理所有这一切而
不是着眼于实际解决自己的开发目标。
幸运的是 c + + 出现了,并引入了类的概念,使得为用户开辟另一条路成为可能:
自动内存管理(或多或少)。好消息是,c + +,如果完全兼容 C 所以进行更改时没有兼容性
问题产生。因此,OpenCV 其 2.0 版本引入一个新的 c + + 接口,通过利用这些优点将为你
的工作提供新的方法。某种程度上,在其中您不需要拨弄内存管理让你的代码简洁(写得更
少,实现的更多)。C + + 接口的唯一主要缺点在于,目前许多嵌入式的开发系统支持仅 C.
因此,除非您的目标是这一平台,否则就没有理由再使用旧的方法(除非你是个受虐狂程序
员和喜欢自讨苦吃)。
你需要知道的关于 Mat 的第一件事是你不再需要手动分配其大小并且当你不需要它的时候
你不再需要手动释放它。虽然这样做仍然是可能的,大多数 OpenCV 函数将手动分配其输出
数据。还有一个额外的好处是如果传递一个已存在 Mat 对象,它已经为矩阵分配所需的空
间,这段空间将被重用。也就是说我们在任何时候只使用与我们执行任务时所必须多的内存
一样多的内存。
Mat 本质上是由两个数据部分组成的类:(包含信息有矩阵的大小,用于存储的方法,矩阵
存储的地址等)的矩阵头和一个指针,指向包含了像素值的矩阵(可根据选择用于存储的方
法采用任何维度存储数据)。矩阵头部的大小是恒定的。然而,矩阵本身的大小因图像的不
同而不同,通常是较大的数量级。因此,当你在您的程序中传递图像并在有些时候创建图像
副本您需要花费很大的代价生成图像矩阵本身,而不是图像的头部。OpenCV 是图像处理库,
它包含大量的图像处理函数。若要解决的计算挑战,最终大部分时间你会使用库中的多个函
数。由于这一原因图像传给库中的函数是一种常见的做法。我们不应忘记我们正在谈论往往
是计算量相当大的图像处理算法。我们想要做的最后一件事是通过制作不必要的可能很大的
图像的拷贝进一步降低您的程序的速度。
为了解决这一问题 OpenCV 使用引用计数系统。其思想是 Mat 的每个对象具有其自己的头,
但可能他们通过让他们矩阵指针指向同一地址的两个实例之间共享该矩阵。此外,拷贝运算
符将只能复制矩阵头部,也还将复制指向矩阵的指针,但不复制矩阵本身。
资源评论
苦茶子12138
- 粉丝: 1w+
- 资源: 7万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功