Verwenden OpenCV, um zu erkennen, Parkplätze

Ich versuche zu verwenden opencv, um automatisch zu finden und zu lokalisieren alle Parkplätze in einen leeren Parkplatz.

Derzeit, ich habe einen code, der Schwellenwerte für das Bild gilt, gilt canny edge detection, und dann verwendet probabilistische hough-Linien zu finden, die Linien, die markieren Sie jeden Parkplatz.

Das Programm zeichnet dann die Linien und Punkte, die die Linien

Hier ist der code:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>

using namespace cv;
using namespace std;

int threshold_value = 150;
int threshold_type = 0;;
int const max_value = 255;
int const max_type = 4;
int const max_BINARY_value = 255;

int houghthresh = 50;

char* trackbar_value = "Value";

char* window_name = "Find Lines";

int main(int argc, char** argv)
{
 const char* filename = argc >= 2 ? argv[1] : "pic1.jpg";
 VideoCapture cap(0);
 Mat src, dst, cdst, tdst, bgrdst;
 namedWindow( window_name, CV_WINDOW_AUTOSIZE );

 createTrackbar( trackbar_value,
          window_name, &threshold_value,
          max_value);

while(1)
{
 cap >> src;
 cvtColor(src, dst, CV_RGB2GRAY);
 threshold( dst, tdst, threshold_value, max_BINARY_value,threshold_type );
 Canny(tdst, cdst, 50, 200, 3);
 cvtColor(tdst, bgrdst, CV_GRAY2BGR);

  vector<Vec4i> lines;
  HoughLinesP(cdst, lines, 1, CV_PI/180, houghthresh, 50, 10 );
  for( size_t i = 0; i < lines.size(); i++ )
  {
    Vec4i l = lines[i];
    line( bgrdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,255,0), 2, CV_AA);
    circle( bgrdst,
         Point(l[0], l[1]),
         5,
         Scalar( 0, 0, 255 ),
         -1,
         8 );
    circle( bgrdst,
         Point(l[2], l[3]),
         5,
         Scalar( 0, 0, 255 ),
         -1,
         8 );
  }

 imshow("source", src);
 imshow(window_name, bgrdst);

 waitKey(1);
}
 return 0;
}

Derzeit mein größtes problem ist, herauszufinden, wie man extrapolieren die Zeile die Daten zu finden, die Standorte der einzelnen Parkplätze. Mein Ziel ist es, opencv finden Sie die Parkplätze und zeichnen Rechtecke auf jedem Parkplatz mit Kennzeichnung der Plätze.

Ich denke, es gibt einige große Probleme mit der Methode, die ich bin derzeit mit, weil, wie gezeigt, in der Ausgabe von Bildern, opencv ist die Erkennung mehrerer Punkte auf der anderen Leitung als die 2 Endpunkte. Möglicherweise machen es sehr schwer zu verwenden opencv, um die Verbindung 2 benachbarte Endpunkte.

Lese ich etwas über die Verwendung von konvexen Hülle, aber ich bin mir nicht genau sicher, was es tut und wie es funktioniert.

Jede Hilfe wird geschätzt.
Hier sind die Bilder aus meinem Programm:
http://imageshack.us/photo/my-images/22/test1hl.png/

http://imageshack.us/photo/my-images/822/test2lw.png/

  • Kann man die Eingänge ohne processing ? Für das problem der Erkennung von mehr Linien/Punkte, als Sie nach sind, RANSAC ist wahrscheinlich besser, die Lösung des Problems, als sich auf Hough.
  • Eine Sache, die mir in den Sinn kommt ist die erste erweitern das Bild, um die Linien dünner. Dann vielleicht opencv wird, erkennen nur die 2 Endpunkte pro Zeile.
  • mischen Sie die Dilatation mit erosion. In diesen Beispielen, die Linien sind hell, so eine Ausdehnung, werden Sie größer. Also lassen Sie uns ersetzen Sie Ihren Vorschlag zur erosion. Jetzt können Sie brechen, dünne Linien. Aber all das ist eigentlich irrelevant, er ist mit Canny, das eine dick-breit Kanten.
  • Die Eingänge sind die Fenster auf der rechten Seite. Es ist ein Bild von einem Parkplatz aus meiner webcam. Ich werde einige der Forschung auf ransac und sehen, wie es umgesetzt werden kann. Also aktuell bin ich mit dem Canny, aber ich denke, es könnte ein besserer Weg, dies zu tun, da jeder angrenzenden Quadraten, die Markierung der Parkplätze teilen kann eine Kante. Soll ich mich mit erosion, um die Linie dünner, so dass nur eine Zeile entdeckt in der canny?
  • vielleicht war ich nicht klar genug in meiner Anfrage, habe ich einfach gefragt, haben Sie die Bilder ohne jegliche Bearbeitung. Die Bilder, die Sie enthalten, hier sind die screenshots, mein Vorschlag ist, gehören einige der aktuellen Bilder, die Sie haben (nicht einen screenshot davon, oder irgendetwas anderes). Damit die Linien dünner der richtige Ansatz erfordert einen Algorithmus zur Ausdünnung, die umgesetzt werden könnten, mit hit-or-miss-Transformation (nicht verfügbar in opencv), aber es gibt auch andere Möglichkeiten, es zu tun. Aber, um genauere Vorschläge (und nicht nur Vermutungen), müssen wir die eigentlichen Daten, die Sie arbeiten mit.
  • Hier ist das original Bild: photographersgallery.com/i/full/parking_lot_markings.jpg Hier ist ein mpeg4-codierte avi-Datei von dem, was meine webcam-Aufzeichnungen (aufgezeichnet mit opencv viderwriter): dropbox.com/s/ysokrddv88wi01k/test.avi
  • vielen Dank 🙂

InformationsquelleAutor tincan | 2013-02-01
Schreibe einen Kommentar