Tôi đang cố gắng sử dụng opencv để tự động tìm và định vị tất cả các điểm đỗ xe trong một bãi đỗ xe trống.Sử dụng OpenCV để phát hiện các điểm đỗ xe
Hiện tại, tôi có mã ngưỡng hình ảnh, áp dụng phát hiện cạnh bất thường và sau đó sử dụng các đường háng xác suất để tìm các đường đánh dấu từng vị trí đỗ xe.
Chương trình sau đó rút ra những dòng và những điểm tạo nên dòng
Đây là mã:
#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;
}
Hiện nay, vấn đề chính của tôi là tìm hiểu làm thế nào để ngoại suy dữ liệu dòng để tìm vị trí của mỗi chỗ đậu xe. Mục tiêu của tôi là để có opencv tìm chỗ đậu xe và vẽ ra hình chữ nhật trên mỗi chỗ đậu xe với một số ghi nhãn các điểm.
Tôi nghĩ rằng có một số vấn đề lớn với phương pháp tôi hiện đang sử dụng, bởi vì như trong hình ảnh đầu ra, opencv đang phát hiện nhiều điểm trên dòng khác với 2 điểm cuối. Điều đó có thể làm cho nó rất khó để sử dụng opencv để kết nối 2 thiết bị đầu cuối liền kề.
Tôi đã đọc điều gì đó về việc sử dụng thân lồi, nhưng tôi không chắc chắn nó hoạt động như thế nào và nó hoạt động như thế nào.
Mọi trợ giúp sẽ được đánh giá cao. Dưới đây là những hình ảnh đầu ra từ chương trình của tôi: http://imageshack.us/photo/my-images/22/test1hl.png/
http://imageshack.us/photo/my-images/822/test2lw.png/
Bạn có thể bao gồm các đầu vào mà không cần xử lý không? Đối với các vấn đề phát hiện nhiều dòng/điểm hơn bạn đang có, RANSAC có khả năng tốt hơn trong việc giải quyết vấn đề như vậy hơn là dựa vào Hough. – mmgp
Một điều mà tôi nghĩ đến là đầu tiên [giãn nở] (http://docs.opencv.org/modules/imgproc/doc/filtering.html#dilate) hình ảnh để làm cho các dòng xuất hiện mỏng hơn. Sau đó, có thể opencv sẽ chỉ phát hiện 2 điểm cuối trên mỗi dòng. –
@TomKnapen bạn đang pha trộn sự giãn nở với xói mòn. Trong những ví dụ này, các dòng sáng, do đó, một sự giãn nở sẽ làm cho chúng lớn hơn. Vì vậy, chúng ta hãy thay thế đề xuất của bạn để xói mòn. Bây giờ bạn có thể phá vỡ các đường mỏng. Nhưng điều này là tất cả không liên quan thực sự, anh ta đang sử dụng Canny mang lại một cạnh rộng một-dày. – mmgp