[EmguCV|OpenCV|C#] 轉換支援存取OpenCV Iplmage的IntPtr型態為EmguCV儲存圖像的型態

這篇文章是紀錄了,之前在撰寫使用CvInovke中調用OpenCV函式時,存取用的IntPtr型態為EmguCV使用的Image 記錄型態,也是為下一篇繪製值方圖時,轉換用的函式紀錄

這邊記錄了兩種從InPtr轉換成EmguCV的格式

如果遇到也要做這方面轉換的人,可以參考參考

前言

 


 

這篇文章是紀錄了,之前在撰寫使用CvInovke中調用OpenCV函式時,存取用的IntPtr型態為EmguCV使用的Image<TColor,TDepth> 記錄型態,也是為下一篇繪製值方圖時,轉換用的函式紀錄

這邊記錄了兩種從InPtr轉換成EmguCV的格式

如果遇到也要做這方面轉換的人,可以參考參考

 

方法一:使用CvInvoke.cvCopy

 


 

1.在EmguCV中最常存放圖像的是透過Image<Bgr, Byte> ,所以我們先創建我們要放置到EmguCV的大小

width, height是你的圖像大小,自己給


Image<Bgr, Byte> dest = new Image<Bgr, Byte>(new System.Drawing.Size(width, height));

 

2.把你現在的IntPtr與要轉換的目的地dest


CvInvoke.cvCopy(srcIntPtr, dest .Ptr, IntPtr.Zero);

之後你就可以拿到srcIntPtr中的影像資訊

 

方法二:透過MIplImage實現

 


在EmguCV中有一個MIpImage結構,這個結構是EmguCV提供的,它等同OpenCV中有實現Managed的IpImage類型

1.先Using System.Runtime.InteropServices

因為我們會使用到Marshal類別,此類別可以幫助我們處理Unmanaged記憶體與Managed記憶體區塊相關事項


//Marshal類別
using System.Runtime.InteropServices;

 

2.透過Marshal.PtrToStructure把Unmanaged記憶體區塊複製到.Net做的資源管理Managed區塊中

使用Marshal.PtrToStructure把Unmanaged未在.Net的記憶體資源管理記憶體轉換成.Net的管理,並轉型成有實現Managed的IpImage的MIpImage結構


MIplImage mi  = (MIplImage)Marshal.PtrToStructure(ptr, typeof(MIplImage));

 

3.創建EmguCV用的Image<Bgr, Byte>,存MIplImage 結構中取得資料


Image<Bgr, Byte> dest = new Image<Bgr, Byte>(mi.width, mi.height, mi.widthStep, mi.imageData);

 

 

如果包裝成一個方法使用如下:


/// < summary >
/// 將IplImage指針轉換成Emgucv中的Image對象;
/// 注意:這裡需要自己根據IplImage中的depth和nChannels來決定
/// </ summary >
/// < typeparam  name = "TColor" >Color type of this image (either Gray, Bgr, Bgra, Hsv, Hls, Lab, Luv, Xyz or Ycc)</ typeparam >
/// < typeparam  name = "TDepth" >Depth of this image (either Byte, SByte, Single, double, UInt16, Int16 or Int32)</ typeparam >
/// < param  name = "ptr" >IplImage指針</ param >
/// < returns >返回Image對象</ returns >
public static Image<TColor, TDepth> IplImagePointerToEmgucvImage<TColor, TDepth>(IntPtr ptr)
            where TColor : struct, IColor
            where TDepth : new()
{
            MIplImage mi  = (MIplImage)Marshal.PtrToStructure(ptr, typeof(MIplImage));
           return new Image<TColor, TDepth>(mi.width, mi.height, mi.widthStep, mi.imageData);
 }

 

 

參考資料:

IntPtr to Image ?

 


 

文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)

另外要轉載請附上出處 感謝