我正在尝试使用opencv在空的 parking 场中自动查找和定位所有 parking 位。

目前,我有一个代码可以对图像进行阈值处理,应用Canny边缘检测,然后使用概率霍夫线来找到标记每个 parking 位的线。

然后程序绘制线条和组成线条的点

这是代码:

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

目前,我的主要问题是弄清楚如何推断线路数据以找到每个 parking 位的位置。我的目标是让opencv找到 parking 位,并在每个 parking 位上画出矩形,并在矩形上标记出相应的位置。

我认为我当前使用的方法存在一些主要问题,因为如输出图像所示,opencv正在检测在线上除2个端点之外的多个点。这可能使使用opencv连接2个相邻端点非常困难。

我读过一些有关使用凸包的信息,但是我不确定它的作用和工作原理。

任何帮助将不胜感激。
这是我程序的输出图像:
http://imageshack.us/photo/my-images/22/test1hl.png/

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

最佳答案

考虑细化您的二进制图像,然后检测端点和分支点。这是根据提供的图像得出的一种结果;端点为红色,分支点为蓝色。

现在,您可以找到 parking 位的位置。一对蓝点始终由一条边连接。每个蓝点连接到两个或三个红点。然后,有几种方法可以找到由两个蓝色点和两个红色点组成的 parking 位,最简单的方法是:找到最接近的一对红色点,其中一个点连接到某个蓝色点,另一个红色点连接到另一个蓝点。该步骤还可以通过检查所考虑的边距平行线的距离来补充。

09-06 14:49