我試圖使用opencv自動查找並找到空停車場中的所有停車位。使用OpenCV檢測停車位
目前,我有一個代碼閾值的圖像,應用Canny邊緣檢測,然後使用概率霍夫線找到標記每個停車位的線。
程序然後繪製組成線的線和點
下面是代碼:
#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正在檢測2個端點以外的多個點。這可能使得使用opencv很難連接2個相鄰的端點。
我讀了一些關於使用凸包的內容,但我不完全確定它的功能和工作原理。
任何幫助將不勝感激。 下面是我的程序的輸出圖像: http://imageshack.us/photo/my-images/22/test1hl.png/
http://imageshack.us/photo/my-images/822/test2lw.png/
您是否可以在沒有任何處理的情況下包含輸入?對於檢測更多線條/點的問題,RANSAC可能比依靠Hough更好地解決此類問題。 – mmgp
我想到的一件事是首先[擴大](http://docs.opencv.org/modules/imgproc/doc/filtering.html#dilate)圖像以使線條顯得更細。然後,也許opencv將只檢測每行2個端點。 –
@TomKnapen你正在混合擴張與侵蝕。在這些例子中,線條很亮,所以擴大會使它們變大。所以讓我們用你的建議來替代侵蝕。現在你可以打破細線。但事實上,這一切都是無關緊要的,他使用的是Canny,它可以產生一個粗寬的邊緣。 – mmgp