@jeremy_larkin
Для выравнивания прямых при помощи OpenCV можно использовать алгоритм RANSAC (Random Sample Consensus). Этот алгоритм позволяет отфильтровать выбросы и оценить параметры модели на основе набора данных.
Ниже приведен пример кода на языке Python, использующий OpenCV для выравнивания прямых с помощью RANSAC. В этом примере предполагается, что у вас уже есть массив lines, который содержит обнаруженные прямые.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
import cv2
import numpy as np
def fit_line_ransac(lines, ransac_iterations=100, ransac_threshold=2):
best_line = None
best_num_inliers = 0
for i in range(ransac_iterations):
# Выберем случайные две прямые из набора данных
sample_indices = np.random.choice(len(lines), 2, replace=False)
sample_lines = lines[sample_indices]
# Найдем точки пересечения выбранных прямых
points = []
for line in sample_lines:
rho, theta = line
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
points.append((x0, y0))
# Оценим параметры модели на основе выбранных прямых
model_line = cv2.fitLine(np.array(points), cv2.DIST_L2, 0, 0.01, 0.01)
# Подсчитаем количество точек, которые находятся в пределах порога от оцененной прямой
num_inliers = 0
for line in lines:
rho, theta = line
x = rho * np.cos(theta)
y = rho * np.sin(theta)
distance = cv2.pointPolygonTest(model_line, (x, y), True)
if distance >= -ransac_threshold:
num_inliers += 1
# Если текущая оценка дает более высокое количество точек-выбросов, обновим наилучшую оценку
if num_inliers > best_num_inliers:
best_line = model_line
best_num_inliers = num_inliers
return best_line
# Определите ваш массив lines, содержащий прямые (rho, theta)
# Вызов функции RANSAC для оценки наилучшей прямой на основе массива lines
best_line = fit_line_ransac(lines)
# Рисуем наилучшую прямую на изображении
h, w = image.shape[:2]
vx, vy, x0, y0 = best_line
x1 = int(x0 - w * vx)
y1 = int(y0 - h * vy)
x2 = int(x0 + w * vx)
y2 = int(y0 + h * vy)
cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
|
В этом примере функция fit_line_ransac принимает массив прямых lines, количество итераций алгоритма RANSAC ransac_iterations (по умолчанию 100) и порог для определения выбросов ransac_threshold (по умолчанию 2). Функция возвращает наилучшую прямую, оцененную на основе RANSAC.
Наилучшая прямая затем используется для отображения на изображении при помощи функции cv2.line().
@jeremy_larkin
Этот код позволяет вам выравнивать прямые на изображениях, используя алгоритм RANSAC. Обратите внимание, что для его работы вам необходимо иметь массив lines, содержащий обнаруженные прямые в формате (rho, theta).
Примеры изображений и результатов можно видеть здесь: https://learnopencv.com/deep-learning-based-text-detection-using-opencv-c-python/
Надеюсь, что эта информация будет полезной для вас. Если у вас возникнут дополнительные вопросы, не стесняйтесь их задавать!