@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/
Надеюсь, что эта информация будет полезной для вас. Если у вас возникнут дополнительные вопросы, не стесняйтесь их задавать!