OpenCVForUnity(二)基本图像容器Mat

前言

今天继续学习OpenCV的基本单位Mat.

学计算机的同学都知道在计算机中,你所看到的一切其都是数据的呈现.期最底层的本质皆是0和1的构成的.当然图片,视频等等也不例外.我们用相机,扫描仪核磁共振成像等方式所获取到的数据,在计算机中都以数值的方式记录画面中每个点的数值.关于

Mat

一、Mat不需要手支分配内存,并在不需要它时立即释放它.在OpenCV功能将自动分配输出数据.

二、如果你传递一个已分配空间的Mat文件,这个空间将被复用.

三、Mat结构有两个部分:
1.矩阵头(用于记录大小,存储方式,地址等.)
2.包含像素(用于记录具体数据) 头文件大小是固定的,而具体数据则不是.

OpenCV包含了大量的图像处理功能,可以图像处理对计算机带来的挑战.当我们将图像交给插件处理时,切不可忘记图片处理背后的原理也非常值得学习.同时应避免使用过大图像进行计算,这样将容易达到性能瓶颈造成卡顿.

指针引用说明

OpenCV使用引用计数系统.每个Mat对像都有自己的头,通过使它们的矩阵指针指向相同的地址.他们可同共享这这个地址,而复制操作则只是复制指针,而不是数据本身.

Texture2D imgTexture = Resources.Load("AA") as Texture2D;
Mat A = new Mat(imgTexture.height, imgTexture.width, CvType.CV_8UC4);
Mat B = new Mat(A, new Range(0, A.rows()), new Range(0, A.cols()));
Mat C = A;
//图片写入Mat
Utils.texture2DToMat(imgTexture, A);
//创建图片
Texture2D textureA = new Texture2D(A.cols(), A.rows(), TextureFormat.RGBA32, false);
Texture2D textureB = new Texture2D(B.cols(), B.rows(), TextureFormat.RGBA32, false);
Texture2D textureC = new Texture2D(C.cols(), C.rows(), TextureFormat.RGBA32, false);
//将Mat的图片写入Texture2D中
Utils.matToTexture2D(A, textureA);
Utils.matToTexture2D(B, textureB);
Utils.matToTexture2D(B, textureC);
//显示出图片
objA.GetComponent<Renderer>().material.mainTexture = textureA;
objB.GetComponent<Renderer>().material.mainTexture = textureB;
objC.GetComponent<Renderer>().material.mainTexture = textureC;

运行结果:
在这里插入图片描述

以上例子中,Mat的头部不同.但因为都指向同一个矩阵,修改其中一个时其他也是会受到影响.

你可以询问矩阵本身属于多少个Mat,当它不再需要时可以清理它.当有人复制他时矩阵引用计数器会增加.
当有头部被清理时会减少.当引用为0时矩阵将被释放.
OpenCV()也为此提供了clone和copyTo()函数.

存储的方式

我们关于存储像素值的问题,可以有好几种选择。首先是颜色空间,就是我们怎样把颜色分量结合在一起来描述一个颜色。最简单的是灰度,我们只用黑白来组合就行。

其他常见的颜色空间都是由三四个基本分量组成的,咱们可以用它们来创建其它分量。最常见的是RGB,因为人类眼睛也是这样看颜色的。

红、绿、蓝。还有的颜色空间可能会加上alpha分量,用于编码透明度。不过,还有很多其他颜色系统都有自己的优点,RGB用得最广,因为咱们的眼睛也就是这样识别颜色的。

不过要记住,OpenCV标准显示系统用的是BGR颜色空间(红色、蓝色通道顺序相反)。

HSV和HLS把颜色划分为色调、饱和度、明度分量,更符合我们描述颜色的方式。

比如,如果你忽略掉明度分量,那你的算法会对输入图像的光线条件不敏感。
YCrCb是JPEG图像格式常用的颜色系统。

每个颜色分量都有自己的有效范围,这就决定了咱们可以用哪些数据类型来存储颜色。所用数据类型的最小可能值是char(也就是一个字节或者8位)。

char型可以是无符号的0~255或者是有符号的-127 至 127。虽然在三个分量的情况下,char型就可以提供1600万种颜色表示方式(就跟我们在RGB情况下说的一样),但如果想要更精细地控制每个分量,那就得使用浮点数(4字节=32位)或double类型(8字节=64位)了。不过要记住,增加分量大小就会增加整个图像在内存中占用的体积哦。

如何创建一个Mat对像

前面我们已经演示过如何装图像文件写入Mat矩阵中.为了更直观方便,可以使用操作符来操作.公适用于二维矩阵.

Mat A = new Mat(512, 512, CvType.CV_8UC4, new Scalar(0,0,255,255));

对于二维矩阵首先我们要明确他的行(rows)和列(cols),这里都写的512.
然后指定了了通道数这里使用了4通道CV_8UC4.意思是: 使用8位长的无符号字符类型,每个像素有四个形成四个通道(最多四个通道)

同上面的方法转为图片后,运行结果:
在这里插入图片描述

具体的使用我们在后面的案例中继续讲解…

Works with Unity Cloud Build iOS & Android support Windows10 UWP support WebGL support Win & Mac & Linux Standalone support Preview support in the Editor OpenCV for Unity is an Assets Plugin for using OpenCV 3.4.2 from within Unity. Official Site | ExampleCode | Android Demo WebGL Demo | Tutorial & Demo Video | Forum | API Reference | Support Modules Features: - Since this package is a clone of OpenCV Java, you are able to use the same API as OpenCV Java 3.4.2 (link). - You can image processing in real-time by using the WebCamTexture capabilities of Unity. (real-time face detection works smoothly on iPhone 5) - Provides a method to interconversion of Unity's Texture2D and OpenCV's Mat. - IDisposable is implemented in many classes.You can manage the resources with the “using” statement. - Examples of integration with other publisher assets are available.(e.g. PlayMaker, NatCam, NatCorder) ExampleCode using OpenCV for Unity is available. MarkerBased AR Example MarkerLess AR Example FaceTracker Example FaceSwapper Example FaceMask Example RealTime FaceRecognition Example GoogleVR with OpenCV for Unity Example Kinect with OpenCV for Unity Example AVPro with OpenCV for Unity Example HoloLens with OpenCV for Unity Example PlayMakerActions for OpenCVforUnity NatCam with OpenCVForUnity Example NatCorder with OpenCVForUnity Example OpenCV for Unity uses OpenCV under 3-clause BSD License; see Third-Party Notices.txt file in package for details. System Requirements Build Win Standalone & Preview Editor : Windows 7 or later Build Mac Standalone & Preview Editor : OSX 10.9 or later
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小盖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值