2014-02-26 121 views
0

我正在開發使用c#的程序,它與實時監控相關聯,就像研究一樣。開發實時視頻監控程序的請求技術

我不打算使用庫,如opencv或emgu等等,在某些情況下,我需要進行像素的詳細調整或訪問所有像素後進行處理。

現在我的算法基本上是使用LockbitsUnlockBits將像素值複製到二維字節數組中,然後我可以執行任何要從該字節數組檢索數據的進程。

對於陣列,我使用自定義結構聲明它:

struct Pixel 
{ 
    Byte B; 
    Byte G; 
    Byte R; 
} 

所以當我處理RGB位圖我可以簡單地使用:bmp[i,j].R, bmp[i,j].G, bmp[i,j].B分別訪問RGB值。

但是,這種方法會導致很長的處理時間,我猜想,當位圖的分辨率很大時,根據我的經驗,320x240很好,但是當我處理704x480時,整個系統都卡住了。

我想知道是否有任何其他方式來訪問所有的像素在一個更快,那麼我的,或者有另一種技術來做實時視頻監控?

謝謝

+0

OpenCV確實允許您調整個別像素。你會更好地使用已經優化了這些技術的軟件包,以便您可以專注於編寫方法來處理它不會執行的部分。 – grovesNL

回答

0

有這麼多在這裏談談......

1)正如你所說,用別針把它在內存中,然後通過指針訪問它,而不是檢查的數據結構,如.NET陣列。

2)考慮轉置/預處理數據,如果您以特定模式訪問數據。位圖通常按行存儲在內存中,但如果按列訪問,則性能將下降。例如,如果您需要逐列訪問或一次訪問一個頻道,請在處理之前旋轉圖像或分離頻道。

3)使你的像素處理代碼高效。

4)並行(如果可能)。

5)使用GPU :-)

有在.NET不錯OpenCV的包裝。 Emgu就是其中之一,並且在其免費版本中提供了CUDA支持。

0

取決於你做什麼。

FIrst,不安全的代碼和指針是訪問的一種更快的方式。可以顯着更快。

其次,根據您的操作,將其加載到d3d表面並使用 - directx。