2016-05-27 7 views
4

Ich versuche, ein Bild mit OpenCV, die eine 400x400-Matte zu drucken:OpenCV nicht erkennen Mat Größe

plot2 = cv::Mat(400,400, CV_8U, 255); 

Aber wenn ich die Punkte versuchen, drucken, geschieht etwas Seltsames. Die Y-Koordinate druckt nur auf die ersten 100 Werte. Das heißt, wenn ich den Punkt (50,100) drucke, wird er nicht im 100/400-ten Teil der Spalten gedruckt, sondern am Ende. Irgendwie haben 400 Spalten verwandelte sich in 100

Zum Beispiel bei der Ausführung dieser:

for (int j = 0; j < 95; ++j){ 
    plot2.at<int>(20, j) = 0; 
} 
cv::imshow("segunda pared", plot2); 

Dies zeigt (der unterstrichene Teil ist der Teil oben auf den Code entspricht):

IMAGE

Eine Zeile, die auf 95 geht, belegt fast alle 400 Punkte, wenn sie nur 95/400 des Bildschirms einnehmen soll.

Was mache ich falsch?

Antwort

6

Wenn Sie Ihre cv::Mat definiert, sagten Sie deutlich, dass es von der Art ist, CV_8U:

plot2 = cv::Mat(400,400, CV_8U, 255); 

Aber wenn Sie versuchen, es zu drucken, Sie sagen, dass seine Art int ist die in der Regel ist ein signiertes 32 Bit nicht vorzeichenlos 8 Bit. So ist die Lösung:

for (int j = 0; j < 95; ++j){ 
    plot2.at<uchar>(20, j) = 0; 
} 

Wichtiger Hinweis: Beachten Sie, dass OpenCV den Standard C++ verwendet Typen nicht die fest diejenigen. Es ist also nicht notwendig, feste Größen wie uint16_t oder ähnliches zu verwenden. Denn beim Kompilieren von OpenCV & wird Ihr Code auf einer anderen Plattform beide zusammen ändern.


BTW, eine der guten Weg durch Ihre cv::Mat zu iterieren ist:

for (size_t row = 0; j < my_mat.rows; ++row){ 
    auto row_ptr=my_mat.ptr<uchar>(row); 
    for(size_t col=0;col<my_mat.cols;++col){ 
     //do whatever you want with row_ptr[col] (read/write) 
    } 
} 
+0

Sind Sie sicher, dass Sie über die „Wichtiger Hinweis“ Abschnitt? Können Sie eine Quelle für diese Informationen bereitstellen? Heißt das, wenn Sie ein Bild als 'plot2 = cv :: Mat (400,400, CV_16U, 255) erstellen;' Zugreifen mit 'plot2.at (20, j) = 0;' wäre falsch? Ich denke nicht. – Antonio

+0

Ja, ziemlich sicher. Ich habe jetzt keinen OpenCV-Code in meiner Hand. und die Suche nach einem Teil des Codes online ist schwer. Sehen Sie das für jetzt http://stackoverflow.com/a/32663709/4523099 Ich werde versuchen, später eine klare Referenz für meine Notiz zu bringen. –

+0

Vielen Dank für das Aufzeigen! Ich habe etwas recherchiert, ich habe meine Ergebnisse als zusätzliche Antwort [dort] gepostet (http://stackoverflow.com/a/37484930/2436175). Ich denke, Ihre Antwort könnte ein bisschen präziser sein: Es ist wahr, man sollte nicht 'uint16_t' verwenden, aber es ist nicht klar, was man eigentlich verwenden sollte (wahrscheinlich wäre unsigned short gut, aber an dieser Stelle würde ich den Ansatz bevorzugen in meiner Antwort). – Antonio