Mam obraz i ma on kilka kształtów. Wykryłem linie z użyciem linii "hough". Jak mogę wykryć, które linie są równoległe?Python openCV wykryj linie równoległe
7
A
Odpowiedz
13
Równanie linii w kartezjańskim układzie współrzędnych:
Y = K * x + bi
dwóch linii y = K1 * x + B1 y = k2 * x + b2 są równoległe, jeśli K1 = k2.
Musisz więc obliczyć współczynnik k dla każdej wykrytej linii.
W celu jednoznacznie zidentyfikować równanie linii trzeba znać współrzędne dwoma punktami, które należą do linii.
Po znalezieniu linii z HoughLines (С ++):
vector<Vec2f> lines;
HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0);
masz linie wektora, który przechowuje parametry (r, theta) wykrytego linii we współrzędnych biegunowych. Trzeba przenieść je we współrzędnych kartezjańskich:
Oto przykład w 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
}
Po dostał te dwa punkty linią można obliczyć swoje równanie.
1
HoughLines zwraca wyniki we współrzędnych biegunowych. Po prostu sprawdź 2. wartość kąta. Nie trzeba konwertować do 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
Jeśli odbywa się to w Pythonie, jak wskazano w znacznikach, można użyć scipy wersję houghlines, który zapewnia obraz wyjściowy houghspace: patrz tutaj] (http://scikit-image.org/docs/dev/auto_examples/plot_line_hough_transform.html). Możesz wtedy obrócić oś niezależną (theta lub "X") i oś zależną (rho lub "Y") tak, że theta jest teraz osią zależną. Po progowaniu tego obrazu przestrzeni Hough (aby uzyskać najbardziej intensywne plamy (rho, theta), które odpowiadają najbardziej prawdopodobnym liniom), można dopasować poziomą linię do danych: theta = stała (y = mx + b bez nachylenia). – chase