tin*_*can 9 c++ opencv image-processing vision
我正在尝试使用opencv自动查找并找到空停车场的所有停车位.
目前,我有一个阈值图像的代码,应用canny边缘检测,然后使用概率hough线找到标记每个停车位的线.
然后程序绘制线条和构成线条的点
这是代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
目前,我的主要问题是弄清楚如何推断线数据以找到每个停车位的位置.我的目标是让opencv找到停车位,并在每个停车位上画出一个矩形,上面标有斑点.
我认为我目前使用的方法存在一些主要问题,因为如输出图像所示,opencv检测除2个端点以外的线路上的多个点.这可能会使用opencv连接2个相邻端点变得非常困难.
我读了一些关于使用凸壳的信息,但我不确定它是做什么以及它是如何工作的.
任何帮助将不胜感激.以下是我的程序输出图像:http: //imageshack.us/photo/my-images/22/test1hl.png/
考虑细化二值图像,然后检测端点和分支点。这是基于所提供图像的一个这样的结果;终点为红色,分支点为蓝色。

现在您可以找到停车位的位置。一对蓝点始终由一条边连接。每个蓝点都连接到两个或三个红点。那么找到两个蓝点和两个红点形成的停车位有几种方法,最简单的是沿着线:找到最接近的一对红点,其中一个点与某个蓝点相连,另一个红点与某个红点相连连接到另一个蓝点。还可以通过检查所考虑的边缘与平行线的接近程度来补充此步骤。