Hallo zusammen, ich stehe vor folgender Aufgabe: Ich soll mit einer Kamera den Auftreffpunkt eines elliptisch bis runden Lichtfleck auf eine Mattscheibe aufnehmen und den Schwer- oder Mittelpunkt des Flecks bzw. eines um den Fleck gelegten Rechtecks bestimmen (x-y-Koordinaten des Mittelpunktpixels). Bin da auf Opencv und C++ gestoßen und meine ersten Schritte sind bisher auch zufriedenstellend verlaufen. So kann ich z. B. mit dem Demoprogramm 'moments' ein Oval um den Fleck legen und auch den Mittelpunkt anzeigen. Nur: wie erhalte ich die Pixelkoordinaten des Mittelpunktes. Ich finde keinen Hinweis darauf, mit welcher Syntax ich unter C++ (auch hier bin ich noch ein ziemlicher Depp) die Koordinaten erhalten kann. Die gleiche Situation ergibt sich, wenn ich eine 'contours'-Routine anwende, auch hier erhalte ich ein Oval bzw. Recheck, nur komme ich nicht darauf, wie ich die Koordinaten der Eckpunkte des Rechtecks bzw. die Mittelpunktskoordinaten des Ovals (Ellipse) erhalte. Ich meine hiermit einen Syntax ähnlich 'x-Koordinate = moments.xpoint und y-Koordinate = moments.ypoint'. Ist vermutlich trivial, aber erst mal draufkommen muss man. Auch ein Hinweis auf Buch / PDF, in der alle Syntax-Statements erklärt sind würde mir schon helfen. Hab schon alles erfolglos abgesucht. Ich hoffe, dass hier jemand ist, der mir weiterhelfen kann und bedanke mich schon mal im Voraus.
Roland K. schrieb: > Hab schon alles erfolglos abgesucht. Im Ernst? Also ich kenn' mich mit OpenCV echt nicht aus, aber bei einer Google-Suche nach "opencv moments" würde ich meinen das der allererste Treffer deine Frage beantworten können sollte. http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/moments/moments.html
Hallo moep, danke für Deinen Hinweis. Den Link hatte ich auch schon gefunden, ich habe nur durch den Syntax (z. B. i < contours.size() irritieren lassen, wenn man sich die Textbedeutung: 'contours.size' vor Augen hält. Zusätzlich bewegen sich meine C++-Kenntnise sich noch auf niederem Niveaun. Außerdem funktionieren manche der Beispielprogramme von Opencv im 'DEBUG-'Modus nicht: also selbst debug-Befehle einbauen, übersetzen, Kommandozeile aufrufen und Programm manuell starten. Ist ziemlich nervig. Werde aber trotzdem nicht darum umherkommen. Trotzdem nochmals vielen Dank.
Roland K. schrieb: > ich > habe nur durch den Syntax (z. B. i < contours.size() irritieren lassen, > wenn man sich die Textbedeutung: 'contours.size' vor Augen hält. Textbedeutung ist immer schlecht :D Was zählt ist, was der Compiler meint was das Konstrukt zu bedeuten hat :) Roland K. schrieb: > Zusätzlich bewegen sich meine C++-Kenntnise sich noch auf niederem > Niveaun. Ist natürlich auch nicht optimal. Zumal das jetzt ja auch kein ganz triviales Einsteigerthema mehr ist. Aber wird schon irgendwie klappen. Ich versuche mal zu erklären (kenne mich mit OpenCV aber wie gesagt auch nicht super aus). "countours" ist ein Vektor, also eine Art Array.
1 | vector<vector<Point> > contours; |
Genauer gesagt ein Vektor der wiederrum mehrere Vektoren von Punkten enthält. Wenn ich das richtig interpretiere ist der innere Vektor von Punkten eine einzelne Kontur, der äußere Vektor (countours) enthält also alle gefundenen Konturen. ".size()" gibt dir die Anzahl von Elementen in einem Vektor zurück, ist hier also vermutlich entsprechend der Anzahl aller gefundnen Konturen. Die Zeile
1 | for( int i = 0; i < contours.size(); i++ ) |
müsste also über alle gefundenen Konturen iterieren.
Hallo moep, vielen Dank für Deine Antwort und Deine Erklärungen. Mit "Textbedeutung" meinte ich natürlich, dass für mich z.B. im Begriff contours.size 'size' eine Eigenschaft von 'contours' ist, und daher kaum etwas mit einer Koordinate zu tun haben kann. Habe mich damit etwas undeutlich ausgdrückt. Ich sehe schon, ich werde ohne eine vernünftige Syntaxbeschreibung der Opencv-Statements nicht weiter- sowie um eine tiefere Einarbeitung in C++ nicht herumkommen. Werde jetzt erst mal versuchen, mich mit den einzelnen Routinen vetraut zu machen und die Syntax besser zu kapieren.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.