Примерно классифицировать линии на изображении как вертикальные или горизонтальные - PullRequest
0 голосов
/ 09 октября 2019

Предположим, у меня есть список координат для линий, извлеченных с помощью cv2.HoughLinesP из маски края , полученной из cv2.Canny детектора края.

lines = [[x1,y1,x2,y2] , ... ]

Линия классифицируется как горизонтальная, еслиего наклон находится в пределах ± 60◦ от горизонтального направления. Все остальные уклоны отбрасываются.

Линия классифицируется как вертикальная, если ее уклон находится в пределах ± 5◦ от вертикального направления. Все остальные уклоны отбрасываются.

import numpy as np
import cv2


def detect_line_angle(line):
    x1, y1, x2, y2 = line
    angle = np.arctan2(x2 - x1, y2 - y1)
    # angle = angle * 180 / 3.14
    return angle


def get_lines_from_edge_mask(edge_mask):
    result = []
    lines = cv2.HoughLinesP(edge_mask, 1, np.pi / 180, 30, maxLineGap=5)
    for line in lines:
        result.append(line[0])

    return result


def is_horizontal(theta, delta=1.05):
    return True if (np.pi - delta) <= theta <= (np.pi + delta) or (-1 * delta) <= theta <= delta else False


def is_vertical(theta, delta=0.09):
    return True if (np.pi / 2) - delta <= theta <= (np.pi / 2) + delta or (
            3 * np.pi / 2) - delta <= theta <= (
                           3 * np.pi / 2) + delta else False


def distance(line):
    dist = np.sqrt(((line[0] - line[2]) ** 2) + ((line[1] - line[3]) ** 2))
    return dist


def split_lines(lines):
    v_lines = []
    h_lines = []
    for line in lines:
        line_angle = detect_line_angle(line)

        dist = distance(line)
        if dist > 30:
            if is_vertical(line_angle):
                v_lines.append(line)

            if is_horizontal(line_angle):
                h_lines.append(line)

    return v_lines, h_lines

Правильно ли моя функция split_lines () относительно угла наклона и направления линии h / v?

РЕДАКТИРОВАТЬ: Тестовое изображение показывает, что есть много не классифицированных линий: 1) все горизонтальные линии были окрашены в зеленый цвет. 2) все вертикальные линии были окрашены в пурпурный цвет. example

1 Ответ

5 голосов
/ 09 октября 2019

Без интенсивной тригонометрии с использованием разностей координат

t5 = tan(5*Pi/180) calculated once
t60 = Sqrt(3)/2 calculated once

Vertical: dy != 0 and abs(dx/dy) < t5
Horizontal: dx != 0 and abs(dy/dx) < t60
...