Forum: PC-Programmierung C++ und Opencv


von Roland K. (rolandk)


Lesenswert?

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.

von moep (Gast)


Lesenswert?

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

von Roland K. (rolandk)


Lesenswert?

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.

von moep (Gast)


Lesenswert?

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.

von Roland K. (rolandk)


Lesenswert?

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
Noch kein Account? Hier anmelden.