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);
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值