OPENCV-Mat类详解

上传人:碎****木 文档编号:220860976 上传时间:2021-12-09 格式:DOCX 页数:10 大小:32.16KB
返回 下载 相关 举报
OPENCV-Mat类详解_第1页
第1页 / 共10页
OPENCV-Mat类详解_第2页
第2页 / 共10页
OPENCV-Mat类详解_第3页
第3页 / 共10页
亲,该文档总共10页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《OPENCV-Mat类详解》由会员分享,可在线阅读,更多相关《OPENCV-Mat类详解(10页珍藏版)》请在金锄头文库上搜索。

1、每次遇到 Mat 都得反复查具体的用法,网上的根底讲解不多,难得看到一篇,赶快转来保藏原文地址: :/ opencvchina /thread103911.html 目标我们有多种方法可以获得从现实世界的数字图像:数码相机、扫描仪、计算机体层摄影或磁 共振成像就是其中的几种。在每种状况下我们人类看到了什么是图像。但是,转换图像到我们的数字设备时我们的记录是图像的每个点的数值。例如在上图中你可以看到车的镜子只是一个包含全部强度值的像素点矩阵。现在,我们如何猎取和存储像素值可能依据最适合我们的需要而变化,最终可能削减计算机世界内的全部图像数值矩阵和一些其他的信息的描述基质本身。OpenCV 是一个

2、计算机视觉库,其主要的工作是处理和操作,进一步了解这些信息。因此,你需要学习和开头生疏它的第一件事是理解OpenCV 是如何存储和处理图像。MatOpenCV 自 2001 年消灭以来。在那些日子里库是围绕C 接口构建的。在那些日子里,他们使用名为 IplImage C 的构造在内存中存储图像。这是您将在大多数较旧的教程和教材中看到的那个。使用这个构造的问题是将 C 语言的全部负面效果都摆到了桌面上。最大的问题是手动治理。它是建立在用户来负责处理内存安排和解除安排的假设之上的。当程序规模较小 时,这是没有问题的,一旦代码基开头变得越来越大它将会越来越挣扎着处理全部这一切而不是着眼于实际解决自己

3、的开发目标。幸运的是 c + + 消灭了,并引入了类的概念,使得为用户开拓另一条路成为可能:自动内存治理或多或少。好消息是,c + +,假设完全兼容 C 所以进展更改时没有兼容性问题产生。因此,OpenCV 其 2.0 版本引入一个新的c + + 接口,通过利用这些优点将为你的工作供给新的方法。某种程度上,在其中您不需要拨弄内存治理让你的代码简洁写得更少,实现的更多。C + + 接口的唯一主要缺点在于,目前很多嵌入式的开发系统支持仅 C. 因此,除非您的目标是这一平台,否那么就没有理由再使用旧的方法除非你是个受虐狂程序员和宠爱自讨苦吃。你需要知道的关于 Mat 的第一件事是你不再需要手动安排其

4、大小并且当你不需要它的时候你不再需要手动释放它。虽然这样做仍旧是可能的,大多数 OpenCV 函数将手动安排其输出数据。还有一个额外的好处是假设传递一个已存在 Mat 对象,它已经为矩阵安排所需的空间,这段空间将被重用。也就是说我们在任何时候只使用与我们执行任务时所必需多的内存一样多的内存。Mat 本质上是由两个数据局部组成的类:包含信息有矩阵的大小,用于存储的方法,矩阵存储的地址等的矩阵头和一个指针,指向包含了像素值的矩阵可依据选择用于存储的方法承受任何维度存储数据。矩阵头部的大小是恒定的。然而,矩阵本身的大小因图像的不同而不同,通常是较大的数量级。因此,当你在您的程序中传递图像并在有些时候

5、创立图像副本您需要花费很大的代价生成图像矩阵本身,而不是图像的头部。OpenCV 是图像处理库, 它包含大量的图像处理函数。假设要解决的计算挑战,最终大局部时间你会使用库中的多个函数。由于这一缘由图像传给库中的函数是一种常见的做法。我们不应遗忘我们正在谈论往往是计算量相当大的图像处理算法。我们想要做的最终一件事是通过制作不必要的可能很大的图像的拷贝进一步降低您的程序的速度。为了解决这一问题 OpenCV 使用引用计数系统。其思想是 Mat 的每个对象具有其自己的头, 但可能他们通过让他们矩阵指针指向同一地址的两个实例之间共享该矩阵。此外,拷贝运算 符将只能复制矩阵头部,也还将复制指向矩阵的指针

6、,但不复制矩阵本身。1. Mat A, C; /仅创立了头部2. A = imread(argv1, CV_LOAD_IMAGE_COLOR); /在此我们知道使用的方法安排矩阵3. Mat B(A); /使用拷贝构造函数4. C = A; /赋值运算符上文中的全部对象,使用同一个数据矩阵。他们的头不同,但是其中任何一个对矩阵进展修改,都会将影响全部其他的矩阵。在实践中的不同对象只是供给一样的底层数据不同的访问方法,然而,它们的头部是不同的。真正好玩的局部是您可以创立仅指向完整数据的一小局部的头。例如,要在图像中创立爱好区域 ( ROI) 只需创立一个新头设置新边界:Mat D (A, Rec

7、t(10, 10, 100, 100) );Mat E = A(Range:all(), Range(1,3);现在,你可能会问多个 Mat 对象使用同一片数据,这片数据什么时候清理。简短的答复是: 由最终一个使用它的对象清理。这里使用引用计数的机制,每当有人复制 Mat 对象的头, 计数器增加。每当一个头被去除,计数器下调。当计数器变为零,矩阵也就被释放了。由于有时会仍旧也要复制矩阵的本身,存在着 clone() 或 copyTo() 函数。Mat F = A.clone();Mat G;A.copyTo(G);现在 modifyingForGwill 不会影响由 theMatheader

8、指出的矩阵。你要记得从全部的是: 1、输出图像安排 OpenCV 功能是自动除非另行指定,否那么。2、用c + + OpenCV 的接口就无需考虑内存释放。3、赋值运算符和复制构造函数构造函数只复制头。4、使用 clone () 或 copyTo () 函数将复制的图像的根底矩阵。存储方法这是关于你是如何存储的像素值。您可以选择的颜色空间和使用的数据类型。颜色空间是指我们如何结合为了代码指定的颜色的颜色重量。最简洁的是灰色的规模。在这里我们所把握的颜色是黑色和白色。组合的这些让我们能制造很多的灰度级。对于彩色的方法,我们有很多方法可供选择。不过,每一就是将他们拆解成三个或四个根本组成局部,这些

9、局部就会组合给全部其他的方法。最受欢送的这一个 RGB,主要是由于这也是我们的眼睛如何建立中我们的眼睛的颜色。其基准的颜色是红、绿、蓝。编写代码的一种颜色的透亮度有时第四个元素:添加 alpha (A)。但是,它们很多颜色系统每个具有自身的优势:1、RGB 是最常见的是我们的眼睛使用类似的事情,我们显示系统还撰写使用这些颜色。 单纯疱疹和合肥分解颜色到他们的色相、饱和度和亮度值/组件,这是我们来描述颜色更自然的方式。您使用,例如可驳回的最终一个组件,使你不那么明智的输入图像的光照条件的算法。2、YCrCb 使用流行的 JPEG 图像格式。3、 CIE L *b*a 是均匀颜色空间,它是格外便利

10、的假设您需要测量给定的颜色,以另一种颜色的距离。现在,每个建筑构件都自己有效的域。这会导致使用的数据类型。我们如何存储组件的定义只是如何精细的把握,我们已于其域。最小的数据类型可能是 char 类型,这意味着一个字节或 8 位。这可能是有符号值-127 到 + 127或无符号以便可以存储从 0 到 255 之间的值。虽然这三个组件的状况下已经给 16 万可能的颜色来表示如 RGB 的状况下 我们可能通过使用浮点数4 字节 = 32 位或 double8 字节 = 64 位数据类型的每个组件获得甚至更精细的把握。然而,请记住增加组件的大小也会增加在内存中的整张图片的大小。显式创立 Mat 对象在

11、 Load, Modify and Save an Ima教ge程中,你已经可以看到如何使用readWriteImageVideo: ”imwrite() ” 函数将一个矩阵写到一个图像文件中。然而,出于调试目的显示的实际值就便利得多。您可以实现此通过 Mat 的运算符。不过,请留意这仅适用于二维矩阵。虽然 Mat 是一个宏大的图像容器类,它也是一般矩阵类。因此,利用Mat 创立和操作多维矩阵是可能的。您可以通过多种方式创立Mat 的对象:1、 Mat()构造函数Mat M(2,2, CV_8UC3, Scalar(0,0,255);cout “M = “ endl “ “ M endl Ma

12、t3、 Create()函数:M.create(4,4, CV_8UC(2);cout “M = “endl “ “ M endlendl;你不能通过这个构造来初始化矩阵中的数值。它只会在新的矩阵尺寸与旧的矩阵尺寸不合时重新安排矩阵的数据空间。MATLAB 风格的初始化函数:zeros(), ones(),:eyes().指定使用的尺寸和数据类型Mat E = Mat:eye(4, 4, CV_64F);cout “E = “ endl “ “ E endl endl; Mat O = Mat:ones(2, 2, CV_32F);cout “O = “ endl “ “ O endl end

13、l; Mat Z = Mat:zeros(3,3, CV_8UC1);cout “Z = “ endl “ “ Z endl endl;对于小的矩阵来说你可以使用逗号隔开的初始化函数:Mat C = (Mat_(3,3) 0, -1, 0, -1, 5, -1, 0, -1, 0);cout “C = “ endl “ “ C endlendl;为一个已有的 Mat 对象创立一个新的头然后 clone()或者 copyTo()这个头. Mat RowClone = C.row(1).clone();cout “RowClone = “ endl “ “ RowCloneendlendl;打印格式留意:你可以通过用 randu()函数产生的随机值来填充矩阵。你需要给定一个上限和下限来确保随机值在你期望的范围内:Mat R = Mat(3, 2, CV_8UC3);cv:randu(R, Scalar:all(0), Scalar:all(255);randu(cv:Mat &dat ,const cv:Scalar &low,const cv:Scalar &high);在上一个例子中你可以看到默认的格式选项。尽管如此,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 教育/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号