Was ist der schnellste Weg, um die Anzahl der weißen Pixel in einem binären Bild mit OpenCV zu erhalten? Gibt es etwas Schnelleres als zwei for-Schleifen und den pixelweisen Zugriff auf das Bild?Der schnellste Weg, um die Anzahl der weißen Pixel in einem Binärbild mit OpenCV zu erhalten
Antwort
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.
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
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
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
Ist das Bild in Graustufen oder ist es ein Binärbild? – Aurelius
@Aurelius: Es ist eigentlich Binärbild, ich hätte das in der Frage geschrieben. – xx77aBs