2013-04-03 25 views
7

Tôi có một hình ảnh và nó có một số hình dạng trong đó. Tôi đã phát hiện ra các đường có sử dụng các đường hough. Làm thế nào tôi có thể phát hiện những dòng nào song song?Python openCV phát hiện các đường song song

+0

Nếu đây được thực hiện trong trăn, như đã nêu trong các thẻ, bạn có thể sử dụng phiên bản scipy của houghlines, cung cấp hình ảnh đầu ra houghspace: Xem ở đây] (http://scikit-image.org/docs/dev/auto_examples/plot_line_hough_transform.html). Sau đó bạn có thể lật trục độc lập (theta hoặc 'X') và trục phụ thuộc (rho hoặc 'Y') sao cho theta bây giờ là trục phụ thuộc. Sau khi đập hình ảnh không gian Hough này (để có được các điểm mạnh nhất (rho, theta) tương ứng với các dòng có khả năng nhất), bạn có thể vừa với đường ngang cho dữ liệu: theta = hằng số (y = mx + b không có độ dốc). – chase

Trả lời

13

phương trình của một dòng trong tọa độ Descartes:

y = k * x + b

Hai dòng y = k1 * x + b1, y = k2 * x + b2 là song song, nếu k1 = k2.

Vì vậy, bạn cần tính hệ số k cho mỗi dòng được phát hiện.

Để duy nhất xác định phương trình của một đường bạn cần biết tọa độ của hai điểm thuộc về dòng.

Sau khi có dòng tìm thấy với HoughLines (С ++):

vector<Vec2f> lines; 
HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0); 

bạn có dòng vector, mà các cửa hàng các thông số (r, theta) của các dòng được phát hiện trong tọa độ cực. Bạn cần phải chuyển chúng trong tọa độ Descartes:

Ở đây ví dụ trong C++:

for(size_t i = 0; i < lines.size(); i++) 
{ 
    float rho = lines[i][0], theta = lines[i][1]; 
    Point pt1, pt2; 
    double a = cos(theta), b = sin(theta); 
    double x0 = a*rho, y0 = b*rho; 
    pt1.x = cvRound(x0 + 1000*(-b)); //the first point 
    pt1.y = cvRound(y0 + 1000*(a)); //the first point 
    pt2.x = cvRound(x0 - 1000*(-b)); //the second point 
    pt2.y = cvRound(y0 - 1000*(a)); //the second point 
} 

Sau khi nhận được hai điểm này của một dòng bạn có thể tính toán phương trình của nó.

+0

thx rất nhiều cho giải pháp của bạn. – vtokmak

+3

Có đủ các giá trị kiểm tra theta để phát hiện các đường song song hay không? Chúng ta có thể nói rằng các giá trị theta bằng đường thẳng song song không? – vtokmak

+0

Tôi nghĩ rằng việc kiểm tra giá trị theta phải đủ kiểm tra. –

1

HoughLines trả về kết quả của nó trong các tọa độ Cực. Vì vậy, chỉ cần kiểm tra giá trị thứ 2 cho góc. Không cần phải chuyển đổi sang x, y

def findparallel(lines): 

lines1 = [] 
for i in range(len(lines)): 
    for j in range(len(lines)): 
     if (i == j):continue 
     if (abs(lines[i][1] - lines[j][1]) == 0):   
      #You've found a parallel line! 
      lines1.append((i,j)) 


return lines1