Mil学习之Mbuf
Posted Thomas会写字
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mil学习之Mbuf相关的知识,希望对你有一定的参考价值。
一、什么是Mbuf
以Mbuf为前缀的函数构成缓冲模块。缓冲区模块允许您分配和控制数据缓冲区(存储区域)和容器(容纳缓冲区和其他容器的MIL对象),这些通常由多个MIL模块的功能操作。缓冲区的示例包括图像缓冲区和查找表(LUT)缓冲区。该模块允许您使用子缓冲区或感兴趣的区域隔离缓冲区的区域,将缓冲区的区域或位平面复制到另一个缓冲区,并将使用拜耳滤波器从相机获取的图像转换为3波段彩色图像。该模块可以归档和检索常用存储格式(如TIFF、JPEG和AVI)的缓冲区数据。该模块还允许您压缩和解压缩图像和序列,无损或无损。
二、Mbuf常用功能
三、 函数调用
1. Alloc
主要使用 MbufAlloc1d、MbufAlloc2d 函数和 MbufAllocColor 函数。
其中 MbufAlloc1d 可能用来分配1D图像、数组、Kernel等。
其中 MbufAlloc2d 可能用来分配2D图像、数组、Kernel等。
MbufAllocColor 可用来分配2D黑白、彩色图片、数组等。
MIL.MbufAlloc1d(MilSystem, 640, 8 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_DISP + MIL.M_GRAB + MIL.M_PROC, ref Image1);
MIL.MbufAlloc2d(MilSystem, 640, 480, 8 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_DISP + MIL.M_GRAB + MIL.M_PROC, ref Image2);
MIL.MbufAllocColor(MilSystem, 3, 640, 480, 8 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_PROC + MIL.M_DISP, ref Image3);
所有分配的MilID都需要释放。
MIL.MbufFree(Image);
2. Child
顾名思义,原图的子buf,对子buf的处理等效于原图处理,因为处理区域更小,所以效率更高一些。
MIL.MbufChildColor(ImageColor, MIL.M_LUMINANCE, ref Image);
MIL.MbufChildColor(ImageColor, MIL.M_RED, ref Image);
MIL.MbufChild2d(ImageGray, 124, 98, 200, 300, ref Image);
MbufChildColor。针对彩色图片的算子,这个是提取原图的某一个通道,要求输入图片是3通道彩色图片,输出图片可以是抽取 RGB, HSL, HSV, YUV中任意一个通道,Mil会自动的将原图转换到对应的格式并抽取你需要的通道给你,这个转换图片格式的过程是在Mil内部完成的,并不会改变输入图片的格式,但是对子buf的处理结果会影响到原图。
1)如果原图是RGB三通道彩色图片ImageColor,我们初始化为全黑;
2)我们提取HSL格式中的L通道子图像ImageChildL,Mil会自动吧RGB格式的原图转换成HSL格式,并把L通道数据给你,然后原图又变成RGB格式。
3)这时我们把L通道子buf数据置成255,你会发现这个操作的影响按照HSL格式图像的方式还原到了RGB原图中。
MIL.MbufAllocColor(MilSystem, 3, 640, 480, 8 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_PROC + MIL.M_DISP, ref Image);
MIL.MbufClear(Image, MIL.M_COLOR_BLACK);
MIL.MbufChildColor(Image, MIL.M_LUMINANCE, ref Image2);
MIL.MbufClear(Image2, 255.0);
MbufChild2d。针对单通道图片的算子。如果我们将原图中某一个2D子buf进行操作等效于在原图设置一个ROI进行操作。
子buf同样需要释放,因为所有分配的MilID都需要释放 。
3. Copy
复制,Clone是复制属性,会分配一个新的图像ID;Copy是单纯的复制图片,不会分配一个新的图像ID。
如果需要快速分配一个MbufID,可以使用Clone函数,如果是有ID需要复制图片数据则使用Copy函数。
举个例子,如果你有一张图片A,Clone得到图片B,那么图片AB一模一样,但是图片B是纯黑的,因为克隆是不包括数据的。
MIL.MbufClone(Image, MIL.M_DEFAULT, MIL.M_DEFAULT, MIL.M_DEFAULT, MIL.M_DEFAULT, MIL.M_DEFAULT, MIL.M_DEFAULT, ref ImageNew);
MIL.MbufCopy(Image, Image2);
4. Control
这个我并不常用,用过Max和Min两个属性重新设置图像映射的最大最小值。即将原图最大最小值范围内的像素中心映射到0-255。
其它的还有Lock,Map等属性可以参考帮助文档。
MIL.MbufControl(ImageSrc, MIL.M_MIN, 20.0);
MIL.MbufControl(ImageSrc, MIL.M_MAX, 200.0);
MIL.MimRemap(MIL.M_DEFAULT, ImageSrc, ImageDst, MIL.M_DEFAULT);
5. Inquire
查询图像信息。
MIL.MbufInquire(ImageSrc, MIL.M_SIZE_BIT, ref SizeBit); // 图像位深 8位
MIL.MbufInquire(ImageSrc, MIL.M_DATA_TYPE, ref DataType); // 图像数据类型 无符号
MIL.MbufInquire(ImageSrc, MIL.M_SIZE_BAND, ref SizeBand); // 图像通道数 1通道或者3通道
MIL.MbufInquire(ImageSrc, MIL.M_SIZE_X, ref SizeX); // 图像宽
MIL.MbufInquire(ImageSrc, MIL.M_SIZE_Y, ref SizeY); // 图像高
6. IO
对于本地图片的读写。
MIL.MbufLoad("1.bmp", min1); // 不会分配新的MilBufID
MIL.MbufRestore("2.bmp", MilSystem, ref Image); // 会分配新的MilBufID
MIL.MbufImport("2.bmp", MIL.M_DEFAULT, MIL.M_RESTORE + MIL.M_NO_GRAB + MIL.M_NO_COMPRESS, MilSystem, ref min1); // 会分配新的MilBufID + 指定图像数据格式
MIL.MbufSave("4.bmp", min1);
7. Data
从MbufID中获取和放置图像数据,对应的有1D 2D等函数,用法类似。需要注意的是数组数据类型和大小。
Byte[] data = new Byte[649*480];
MIL.MbufGet(MilImageID, data); // 从MilID中取出数据到数组
MIL.MbufPut(MilImageID, data); // 从数组中取出数据到MilID
8. Other
// 设置图片处理的ROI,ROI图片非0的区域都是有效区域
MIL.MbufSetRegion(ImageSrc, ImageRoi, MIL.M_DEFAULT, MIL.M_DEFAULT, MIL.M_DEFAULT);
// 初始化图片为纯黑图片
MIL.MbufClear(ImageSrc, 0.0);
以上是关于Mil学习之Mbuf的主要内容,如果未能解决你的问题,请参考以下文章