在 Halcon 中,或许大部分人都知道如何通过 get_grayval
获取图像的灰度值,这条算子在获取单个像素时是比较好用的。但是当你想获取一幅大尺寸图像的一行甚至所有的灰度数据时,它就会变得很吃力。这一点在该算子的介绍文档中也有提及。
这里要介绍的是通过 get_image_ponter1
或 get_image_pointer3
获取图像数据,这样的方法也是 Halcon 文档中所推荐的方式,遗憾的是 Halcon 文档中并没有继续这个话题,甚至百度和谷歌都找不到任何一条关于如何使用它来获取图像数据的。
事实上C#操作内存的方法并不是没有,只是比较冷门,大家都没用,资料也少,如此便成了恶性循环...唠叨一句。而C#的内存操作就不得不提 System.Runtime.InteropServices 这个命名空间下的 Marshal 类了。而今天我们也是要用到这个类下的 Copy 方法。
废话不多说,上代码:
private byte[] GetImageData(HImage image)
{
HTuple t, w, h;
IntPtr p;
p = image.GetImagePointer1(out t, out w, out h);
int len = w * h;
byte[] data = new byte[len];
System.Runtime.InteropServices.Marshal.Copy(p, data, 0, len);
return data;
}
共勉之!