2013-06-04 5 views

Antwort

11

Die prägnanteste Weg dies zu tun ist:

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

Wenn Sie auf einem binären Bild arbeiten, dann wird der Anruf an cv::inRange() nicht erforderlich ist, und cv::countNonZero() einfach ausreichen.

Obwohl jede Methode durch alle Pixel iterieren muss, kann dies OpenCVs eingebaute parallel_for_() nutzen, die parallele Ausführung ermöglicht.

Wenn Ihr Bild kontinuierlich ist, können Sie alle Daten mit einer einzigen Schleife durchlaufen.

+0

Danke, cv :: inRange ist was ich wollte! Ich benutze tatsächlich OpenCV durch EmguCV-Wrapper (in C#), und diese eine Zeile beschleunigt mein Programm für etwa 40%. Haben Sie eine Idee, warum das Schleifen in zwei for-Schleifen so viel langsamer ist? – xx77aBs

+3

Ich bin nicht sehr vertraut mit C#, aber ich glaube, es prüft Grenzen, wenn Sie in einer Schleife iterieren, was einige der Leistungsunterschiede erklären könnte. – Aurelius

+0

Danke, Grenzen überprüft wirklich Dinge verlangsamt. Aber Ereignis, nachdem ich Begrenzungen gesperrt habe, für ein sehr großes Bild (10240 x 7680) CV-Funktion dauert etwa 70 ms, und zwei for-Schleifen dauern etwa 350 ms. Nach der Verwendung von Parallel.For dauerte der Ansatz mit zwei Schleifen ungefähr 200 ms, aber das ist immer noch viel länger als die OpenCV-Implementierung. – xx77aBs