Неправильные коэффициенты для линейного уравнения - PullRequest
1 голос
/ 25 октября 2019

Предположим, у меня есть список сегментов линии [[[x1,y1],[x2,y2],...], обнаруженных с помощью cv2.HoughLinesP. Этот список представляет только конечные точки каждого сегмента линии.

Сегменты были отсортированы по значению x2, x2, т.е. упорядочены «слева направо» относительно изображения, из которого были взяты сегменты.

segments_sorted = [[(0, 797), (46, 769)], [(2, 766), (138, 690)], [(220, 644), (399, 541)], [(427, 523), (615, 414)], [(460, 513), (615, 419)], [(495, 491), (614, 419)], [(753, 368), (843, 518)], [(958, 708), (1099, 706)], [(1047, 681), (1088, 729)], [(1047, 706), (1095, 761)]]

Для лучшего понимания они были нарисованы на изображении, показанном ниже:

enter image description here

Мне нужно захватить левуюбольшинство и крайняя правая линия расширяют их до границ изображения (крайняя левая и крайняя правая точки сегмента соответственно).

left_most_segment = [(0, 797), (46, 769)]

right_most_segment = [(1047, 706), (1095, 761)]

def get_line_coefficients(line):
    (x1, y1), (x2, y2) = line
    a = y1 - y2,
    b = x2 - x1,
    c = (x1 - x2) * y1 + (y2 - y1) * x1

    return a, b, c

# using the Ax + By + C = 0 equation  - get the coefficients and update the  endpoints

r_a, r_b, r_c = get_line_coefficients(right_most_segment)

# l_a = -55
# l_b = 48
# l_c = 23697

Проблема в том, что для всех сегментов, в которые я вписываюсь, get_line_coefficients() значение коэффициента c слишком велико, например -36662 или 23697.

Раньше я думал обновить координаты x, y конечной точки.

# e.g. for the right-most segment, x1,y1 should now be updated

new_x = 0
new_y =  -(r_a*new_x + r_c) / r_b

new_x = image.shape[1]

new_y = r_a * new_x + r_c / r_b

sorted_lines[-1][1] = [new_x, new_y]

cv2.polylines(original, np.array(sorted_lines), False, RGB_BLUE, thickness=3)

cv2.polylines прерывается на

...
cv2.error: OpenCV(4.1.1) /io/opencv/modules/imgproc/src/drawing.cpp:2435: error: (-215:Assertion failed) p.checkVector(2, CV_32S) >= 0 in function 'polylines'

1 Ответ

2 голосов
/ 25 октября 2019

А фиктивная проблема была вызвана несоответствием типов.

new_y = int(-(r_a * new_x + r_c) / r_b) # should be an int

После нескольких тестов Становится очевидным, что значение c было вычислено правильно.

изображениес самой правой продленной линией enter image description here

...