2013-02-01 28 views
7

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/

+0

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

+0

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. –

+0

@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

Trả lời

2

Cân nhắc làm loãng hình ảnh nhị phân của bạn, và sau đó phát hiện các điểm cuối và các điểm chi nhánh. Đây là một kết quả như vậy dựa trên các hình ảnh được cung cấp; điểm cuối có màu đỏ và điểm chi nhánh có màu xanh lam.

enter image description here

Bây giờ bạn có thể tìm thấy vị trí của chỗ đậu xe. Một cặp chấm màu xanh luôn được kết nối bằng một cạnh duy nhất. Mỗi chấm màu xanh dương được kết nối với hai hoặc ba điểm màu đỏ. Sau đó, có một số cách để tìm chỗ đậu xe được tạo thành bởi hai chấm màu xanh và hai chấm đỏ, đơn giản nhất là dọc theo các đường: tìm cặp chấm đỏ gần nhất, nơi một chấm được kết nối với một chấm màu xanh cụ thể và điểm đỏ khác được kết nối với dấu chấm màu xanh lam khác. Bước này cũng có thể được bổ sung bằng cách kiểm tra xem các đường song song gần với các cạnh được xem xét như thế nào.

+0

ok cảm ơn tuyệt vời. bạn có sử dụng xói mòn để làm mỏng hình ảnh được ngưỡng không? Tôi sẽ thử sáng nay và xem nó như thế nào. – tincan

+0

Về nguyên tắc có, xem http://en.wikipedia.org/wiki/Morphological_sk cho các cấu trúc hình thái nhị phân xương cổ điển xây dựng. – mmgp

+0

Tôi hiện đang bị mắc kẹt khi nhận được bộ xương của hình ảnh nhị phân. Về cơ bản tôi đang sử dụng mã được tối ưu hóa từ đây: http://felix.abecassis.me/2011/09/opencv-morphological-skeleton/, ngoại trừ thay vì làm xói mòn và giãn nở, tôi đang sử dụng hình thái học để làm hình thái mở. Và cuối cùng, tôi chuyển skel vào Mat toàn cầu được sử dụng để phát hiện cạnh Canny. Vấn đề là chương trình bị treo khi tôi chạy nó. Cửa sổ hiển thị, nhưng không có hình ảnh nào được hiển thị. Tôi đã bị cô lập vấn đề với vòng lặp while, nhưng tôi không chắc chắn chính xác những gì đang gây ra nó. – tincan