2017-07-07 3 views
0

Mit einer Gruppe von Freunden versuchen wir, eine Computer-Vision-Aufgabe auf Raspberry Pi zu erreichen, die mit C++ unter Verwendung der OpenCV-Bibliothek codiert.Ermitteln der Reihenfolge der Objekte mit OpenCV 3

Lassen Sie mich zuerst die Aufgabe erklären. Es gibt ein Muster, das aus 16 einzelnen Quadraten besteht, wobei jedes Quadrat rot, gelb oder blau gefärbt ist. Wir montieren rasperry pi auf einem Quadcopter mit seinem Kameramodul und sammeln den Video-Feed des Musters.

Wir müssen Farben von Quadraten erkennen, die mit ein wenig Forschung im Netz leicht zu erreichen war. Ein schwieriges Teil ist, dass wir auch die Reihenfolge der Quadrate erkennen müssen, um die Farben in einem Array in einer Reihenfolge zu speichern.

Bisher haben wir die gewünschten Farben (rot, gelb, blau) gefiltert, um die Quadrate zu bestimmen.

example pattern to recognize and our process so far

Im zweiten Bild kennen wir die Farben und Mittelpunkte von jedem Quadrat. Was wir brauchen, ist eine Möglichkeit, sie in einer Reihenfolge in eine Datei oder auf dem Bildschirm zu schreiben.

Und um die Reihenfolge zu finden, haben wir verschiedene OpenCV-Methoden ausprobiert, die Ecken finden. Mit Eckpunkten verglichen, verglichen wir jeden Punkt und bestimmten Endpunkte, so dass wir ein begrenztes Rechteck zeichnen und kleine Verzerrungen überwinden konnten.

Aber da Quadcopter den Video-Stream bekommt, gibt es immer eine Chance auf hohe Verzerrung. Das vermasselt unsere Eckentheorie, was zu einer falschen Reihenfolge der Farben führt. Zum Beispiel kann es ein Bild wie diese erfassen:

highly distorted image

Es ist nicht richtig, um diese Plätze zu finden, indem ihre Mittelpunkte zu vergleichen. Es wird auch nicht funktionieren, nach Endpunkten zu suchen, um ein größeres Rechteck um sie herum zu zeichnen, um das Muster abzuflachen. Und dann bestellen ...

Was ich verlange, ist Algorithmus Vorschläge. Gehen wir völlig in die falsche Richtung und versuchen, Ecken zu finden? Ist es möglich, die Reihenfolge zu bestimmen, ohne Verzerrungen zu berücksichtigen?

Vielen Dank im Voraus.

+0

Verwenden Sie cv :: minAreaRect, um eine rotierte Bounding Rect um alle Ihre Boxen zu erhalten. Wählen Sie dann eine Ecke, die sich links oben im Gitter befindet (mehrdeutig für Verzerrungen> = 45 Grad) und berechnen Sie Ihren Mittelpunkt relativ zum gedrehten Begrenzungsrechteck (z. B. durch Drehen aller Mittelpunkte zurück). – Micka

+0

Mit dem gedrehten Bounding Rect als Basis könnten Sie sogar das Gitter erraten (wenn Sie die Gittergröße kennen) und segmentierte Farbfelder wählen, die am besten zu jeder der vermuteten Gitterpositionen passen. – Micka

Antwort

0

Nehmen Sie die zwei am weitesten auseinander liegenden Zentren und nummerieren sie 1 und 16. Dann finden Sie die zwei Zentren, die am weitesten von der Linie 1-16 entfernt sind, links (Nummer 4) und rechts (Nummer 13)). Jetzt hast du die vier Ecken.

Berechnen Sie die affine Transformation, die die Koordinaten der Ecken 1, 4 und 13 auf (0,0), (3,0) und (0,3) abbildet. Wenden Sie diese Transformation auf die 16 Zentren an und runden Sie sie auf die nächsten Ganzzahlen. Wenn alles gut geht, erhalten Sie die "logischen" Koordinaten der Quadrate im Bereich [0, 3] x [0, 3]. Die Zuordnung zu den Zellindizes erfolgt sofort.

Beachten Sie, dass aufgrund der Symmetrie eine vierfache Unbestimmtheit bleibt, die Sie wahrscheinlich durch Überprüfen der Farbmuster heben können.

enter image description here

wird dieses Verfahren zu Verformungen sehr robust sein. Wenn es eine extreme Perspektive gibt, können Sie sogar die vier Ecken ausnutzen, um eine homographische Transformation statt einer affinen zu bestimmen. In Ihrem Fall bezweifle ich, dass dies nützlich sein wird. Sie können das ordnungsgemäße Arbeiten beurteilen, indem Sie überprüfen, ob alle erwarteten Indizes zugewiesen wurden.

Verwandte Themen