Использование OpenCV для обнаружения парковочных мест

Я пытаюсь использовать opencv для автоматического поиска и определения местоположения всех парковочных мест на пустой парковке.

В настоящее время у меня есть код, который порождает изображение, применяет обнаружение краев, а затем использует вероятностные линии, чтобы найти линии, которые отмечают каждое парковочное место.

Затем программа рисует линии и точки, которые составляют линии

Вот код:

#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;
}

В настоящее время моя главная проблема - выяснить, как экстраполировать данные линии, чтобы найти местоположение каждого парковочного места. Моя цель - заставить opencv найти парковочные места и нарисовать прямоугольники на каждом парковочном месте с номером, обозначающим места.

Я думаю, что есть некоторые серьезные проблемы с методом, который я использую в настоящее время, потому что, как показано на выходных изображениях, opencv обнаруживает несколько точек на линии, отличных от двух конечных точек. Это может затруднить использование opencv для соединения 2 смежных конечных точек.

Я читал кое-что об использовании выпуклой оболочки, но я не совсем уверен, что он делает и как он работает.

Любая помощь будет оценена. Вот выходные изображения из моей программы: http://imageshack.us/photo/my-images/22/test1hl.png/

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

1 ответ

Решение

Подумайте об уменьшении размера вашего двоичного изображения, а затем определите конечные точки и точки ветвления. Вот один такой результат, основанный на предоставленных изображениях; конечные точки выделены красным, а ветви - синим.

Теперь вы можете найти места парковочных мест. Пара синих точек всегда соединена одним ребром. Каждая синяя точка связана с двумя или тремя красными точками. Тогда есть несколько способов найти парковочное место, образованное двумя синими и двумя красными точками, самый простой - вдоль линий: найти ближайшую пару красных точек, где одна точка связана с определенной синей точкой, а другая красная точка связан с другой синей точкой. Этот шаг также можно дополнить проверкой того, насколько близки к параллельным линиям рассматриваемые ребра.

Другие вопросы по тегам