2013-06-04 127 views

回答

11

最簡潔的方式來完成,這是:

cv::Mat image, mask; //image is CV_8UC1 
cv::inRange(image, 255, 255, mask); 
int count = cv::countNonZero(mask); 

如果你是一個二進制圖像上進行操作,然後調用cv::inRange()是不必要的,只是cv::countNonZero()就足夠了。

雖然任何方法都必須迭代所有像素,但這可能能夠利用OpenCV的內置parallel_for_(),這允許並行執行。

如果圖像是連續的,則可以使用單個循環遍歷所有數據。

+0

謝謝,cv :: inRange就是我想要的!我實際上是通過EmguCV封裝(使用C#)來使用OpenCV,而這一行使我的程序加速了大約40%。你有什麼想法爲什麼循環兩個for循環是如此慢? – xx77aBs

+3

我對C#不是很熟悉,但我相信它在循環中迭代時會檢查邊界,這可以解釋一些性能差異。 – Aurelius

+0

謝謝,邊界檢查實際上是在放慢速度。但是,在禁用邊界檢查之後的事件中,對於非常大的圖片(10240x7680),CV函數需要大約70ms,而兩個for循環大約需要350ms。在使用Parallel.For之後,兩個循環方法花費了大約200ms,但是OpenCV實現的時間仍然長得多。 – xx77aBs

相關問題