2013-05-06 191 views
2

我學習使用Emgu簡歷,偶然發現了這個開放CV例如:http://aishack.in/tutorials/tracking-colored-objects-in-opencv/如何使用CvInRange在Emgu CV

我想創建此代碼重新創建Emgu的CvInRange功能:

// create upper & lower limit (HSV) 
MCvScalar botLimit = new MCvScalar(20, 100, 100); 
MCvScalar uprLimit = new MCvScalar(30, 255, 255); 

// prepare the destination 
Image<Hsv, byte> imageHSVDest = new Image<Hsv, byte>(imageWidth, imageHeight); 

// 
CvInvoke.cvInRange(imageHSV, botLimit, uprLimit, imageHSVDest); 

CvInvoke.cvInRange()的產生此錯誤消息(在VS2010):

錯誤1關於「Emgu.CV.CvInvoke.cvInRange(System.IntPtr,System.IntPtr,SYST最好重載方法匹配em.IntPtr,System.IntPtr)'有一些無效參數
錯誤2參數2:無法從'Emgu.CV.Structure.MCvScalar'轉換爲'System.IntPtr' 錯誤3參數3:無法從'Emgu轉換。 CV.Structure.MCvScalar'到'System.IntPtr'

看起來有一個不匹配的數據類型。我已經搜索如何將Emgu MCvScalar轉換爲IntPtr無濟於事。

我使用了MCvScalar,翻譯了示例中的OpenCV cvScalar(20, 100, 100)。這是錯的嗎?

+0

忘了說,我已經成功在我的節目一樣做基本的東西:打開的圖像,在imagebox觀看圖像並將其轉換爲HSV色彩空間。 – 2013-05-06 21:14:31

回答

2

改爲使用內置的Emgu CV功能InRange。然後,它看起來像這樣:

Hsv lowerLimit = new Hsv(20, 100, 100); 
Hsv upperLimit = new Hsv(30, 255, 255); 

Image<Gray, byte> imageHSVDest = imageHSV.InRange(lowerLimit, upperLimit); 

請觀察imageHSVDest是值0(黑色)和255(白色)的二進制圖像。

1

我正在使用Emgu CV 3.1.0。在類似的問題跌跌撞撞像你一樣,我解決了它這種方式:

CvInvoke.InRange(imageHSV, new ScalarArray(new MCvScalar(20, 100, 100)), 
          new ScalarArray(new MCvScalar(30, 255, 255)), imageHSVDest); 

MCvScalar不能直接在CvInvoke.InRange因爲後者發生在IInputArray參數一起使用,因此你可以用數組包裹標量。


參考: CvInvoke.InRange Method Documentation