Bei der Bildverarbeitung kann das Verständnis der Reihenfolge von Punkten von entscheidender Bedeutung sein. OpenCV, eine beliebte Computer-Vision-Bibliothek, verwendet ein Koordinatensystem, das zu Verwirrung hinsichtlich der Darstellung von Punkten führen kann.
Die Frage:
Betrachten Sie ein in einem gespeichertes Bild Matrix src mit den Abmessungen 300x200. Bei Anwendung der folgenden Operation:
for(int i = 0; i < src.rows; i++){ for(int j = 0; j < src.cols; j++){ line( src, Point(i,j), Point(i,j), Scalar( 255, 0, 0 ), 1,8 ); } } imshow("A",src); waitKey(0);
Das erwartete Ergebnis besteht darin, das gesamte Bild mit weißen Linien zu füllen. Allerdings wird nur der obere Teil weiß.
Dieses Verhalten steht im Gegensatz zum folgenden Vorgang:
for(int i = 0; i < src.rows; i++){ for(int j = 0; j < src.cols; j++){ src.at<uchar>(i,j)=255; } } imshow("A",src); waitKey(0);
bei dem das gesamte Bild erfolgreich mit Weiß gefüllt wird.
Die Antwort:
Die Erklärung liegt in den unterschiedlichen Darstellungen, die dafür verwendet werden Punkte:
Diese Diskrepanz ergibt sich aus der Doppelnatur von OpenCVs Mat, das sowohl Bilder als auch Matrizen darstellt. In der Matrixschreibweise wird die Zeilen-Hauptreihenfolge verwendet, wobei der erste Index die Zeile und der zweite Index die Spalte darstellt. Diese Konvention stimmt mit src.at
Im Gegensatz dazu folgt das Koordinatensystem für Punkte der Bildnotation, wobei der erste Wert die x-Richtung (Spalte) angibt und der zweite Der Wert gibt die Y-Richtung (Zeile) an. Dies erklärt die Verwendung der (Spalte,Zeile)-Reihenfolge in Punkt(x,y) und die Ausrichtung mit src.at
Das Verständnis dieser Unterscheidung ist für den effektiven Zugriff und die Änderung von wesentlicher Bedeutung Punkte in OpenCV.
Das obige ist der detaillierte Inhalt vonWarum führt „Point(x,y)' in OpenCV zu unerwarteten Ergebnissen, wenn es mit „line()' im Vergleich zu „src.at(i,j)' verwendet wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!