在 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;
}
共勉之!