2017-04-26 23 views
0

我有一個事件線程,當從USB攝像頭收到圖像時會觸發事件線程。這很好。如何使用EMGUcv ImageBox控件顯示來自單獨圖像捕獲事件線程的圖像

但是,在同一事件捕獲線程中,我希望在具有emgu ImageBox控件的UI窗體中顯示該圖像。我無法直接對ImageBox1.Image = capturedImage進行編碼,因爲ImageBox位於UI窗體而不在OnImageEvent線程中。

我在這裏使用某種類型的Invoke/Delegate來跳轉線程嗎? (我仍然在學習使用這些)

但我找不到任何對emgu ImageBox控件的調用的引用。有沒有人有任何使用emgu Imagebox在這種交叉類型的應用程序的經驗?

當前代碼:

' This method defines an image event. In it, the image that 
' triggered the event is converted and saved before incrementing 
' the count. Please see Acquisition_CSharp example for more 
' in-depth comments on the acquisition of images. 
Protected Overrides Sub OnImageEvent(capturedImage As ManagedImage) 

    Console.WriteLine("Image event occurred...") 

    ImageBox2.Image = ConvertToOpenCVMat(capturedImage) 

    . 
    . 
    . 
+0

使用[**線程安全方法調用**](http://stackoverflow.com/documentation/vb.net/1913/threading/6235/performing-thread-safe-calls-using-control-invoke# T = 201704262256035702174)。 –

+0

似乎沒有一個emgu ImageBox。任何人都可以證實這一點 – TomG

+0

你可以調用任何控件,它不一定是你要修改的那個控件。重要的是你調用到UI線程。 - 由於EmguCV的'ImageBox'似乎沒有'Invoke'方法,所以你可以直接調用_ **表單本身** _替代:'Me.Invoke()'或者:' .Invoke() '。 –

回答

0
從USB攝像機接收到一個模塊中的公共變量

保存圖像數據;該變量可以直接被主線程(UI窗體線程)訪問以顯示。唯一必須處理的是避免兩個線程之間發生衝突(輔助線程想要將圖像數據保存到變量中,而主線程想從中讀取;可以使用信號量來完成此操作)。

+0

WinForms和WPF都具有處理跨線程調用的線程安全方法。爲什麼重新發明輪子既費時又可能「不安全」? - 在[** Stack Overflow文檔**]上查看我的示例(http://stackoverflow.com/documentation/vb.net/1913/threading/6235/performing-thread-safe-calls-using-control-invoke #T = 201704262256035702174)。 –

+0

我可以通過保存一個公共變量並使用emgu ImageBox控件在UI窗體線程中顯示它來使用上面描述的Raffaello方法工作。這證實我的onImageEvent()正確地從USB攝像頭捕獲圖像。 - Howeve,我同意視覺文森特應該有一種方法來做到這一點與調用,但我似乎無法找到一種方法來使用Emgu ImageBox控件與調用,任何與emgu知識可以確認這是否可能?謝謝 – TomG

相關問題