EmguCV可以想成是C#版的OpenCV,所以換句話說等於是,你可以在C#程式語言上使用的電腦視覺Open Source API 開發相關的影像處理操作或一些影像物件辨識、追蹤等需求。
因此有許多人可能會使用EmguCV來取得從KinectSDK取得的影像來做後面的處理
前言
EmguCV可以想成是C#版的OpenCV,所以換句話說等於是,你可以在C#程式語言上使用的電腦視覺Open Source API 開發相關的影像處理操作或一些影像物件辨識、追蹤等需求。
隨著Kinect具備的紅外線感應器所帶來的深度資訊,讓影像處理、電腦視覺這塊領域上有了更重大的進展、透過深度這個資訊,除了可以讓我們在識別時,有了新的訊息協助判斷影像中所需要的目標物,也可以減少過往為了能夠識別出物體而加入的要花費效能上的演法,並且Kinect也價格已非常平易近人。
因此有許多人可能會使用EmguCV來取得從KinectSDK取得的影像來做後面的處理
而此篇就是要協助,如何透過EmguCV取得KinectSDK的影像資訊。
步驟
在這邊我以EmguCV 2.4.0與KinectSDK 1.5版為例
1﹒安裝好KinectSDK與EmguCV
並且確保兩個部分分別都可以開發執行
2﹒使用以下兩個.cs檔案 ImageExtemsion.cs與EmguImageExtension.cs檔案
(之前也是遇到此問題,後來 發現網路上有提供)
ImageExtemsion.cs:提供一些靜態方法,協助你可以把Kinect SDK的深度影像與彩色影像轉換成WPF的Bitmap或BitmapSource類別儲存影像資訊
EmguImageExtension.cs:裡面會用到ImageExtemsion.cs檔案中的方法,把KinectSDK的彩色影像轉換成EmguCV的格式
以上兩個檔案建議可以閱讀一下了解它的使用方法。
3﹒在專案中的參考,如果沒有System.Drawing dll請記得要加入,上述兩個檔案會使用到
4﹒在你要編寫的檔案中加入
using ImageManipulationExtensionMethods;
5﹒編寫拿取影像的程式碼
在拿取影像的事件中透過擴充方法,可以把ColorImageFrame的物件轉換成Image<Bgr,Byte>這個可以吃EmguCV的資料格式
如下範例:
private void sensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
{
using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
{
if (colorFrame != null)
{
colorFrame.CopyPixelDataTo(colorPixels);
//轉型成EMGU用
Image<bgr,byte> convertImage = colorFrame.ToOpenCVImage<bgr,byte>();
Image<gray, byte> grayFrame = convertImage.Convert<gray, byte>();
Image<gray, byte> cannyFrame = grayFrame.Canny(new Gray(100),new Gray(60));
imageViwer.Source = cannyFrame.ToBitmapSource();
colorBitmap.WritePixels(new Int32Rect(0, 0, sensor.ColorStream.FrameWidth, sensor.ColorStream.FrameHeight),colorPixels, colorBitmapStride, 0);
}
}
}
如果上述一切成功,執行時便會看到以下結果
結論
看到網路上有人有提到這個問題,便寫了這篇,目的也是希望以後要使用時可以快速把擷取影像的部份解決
把時間花在後面的影像處理演算流程。
上述兩個檔案來自原網路上,目前已經不記得是從哪找到,但是很感謝這兩個檔案幫助我能快速完成這部分
另外,也建議兩個檔案可以研讀一下 =)
參考資料
Kinect 結合Emgu CV影像處理(SDK v1.5) WPF版 (取自朋友的 再加了一些內容與測試)
文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)
另外要轉載請附上出處 感謝