Как найти расстояние между грубыми линиями в openCV? - PullRequest
0 голосов
/ 11 ноября 2019

Я новичок в opencv-python. Я нашел линии на изображении через houghtransformP. Линии, нарисованные в результате грубого преобразования, более не поддерживаются и дают несколько линий. Мне нужно нарисовать только одну линию для краев и найти «расстояние» между найденными линиями.

Выходное изображение показано ниже

"""
Created on Fri Nov  8 11:41:16 2019

@author: romanth.chowan
"""

import cv2
import numpy as np
import math


def getSlopeOfLine(line):
    xDis = line[0][2] - line[0][0]

    if (xDis == 0):
        return None

    return (line[0][3] - line[0][1]) / xDis

if __name__ == '__main__':
    inputFileName_ =r"C:\Users\romanth.chowan\Desktop\opencv\stent spec\2prox.jpeg"
    img = cv2.imread(inputFileName_)
    img1=cv2.GaussianBlur(img,(5,5),0)

    gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    edges = cv2.Laplacian(gray,cv2.CV_8UC1) # Laplacian Edge Detection
    lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 300, 10, 10)
    print(len(lines))
    parallelLines = []

    for a in lines:
        for b in lines:
            if a is not b:
                slopeA = getSlopeOfLine(b)
                slopeB = getSlopeOfLine(b)

                if slopeA is not None and slopeB is not None:
                    if 0 <= abs(slopeA - slopeB) <= 10:
                       parallelLines.append({'lineA': a, 'lineB': b})

    for pairs in parallelLines:
        lineA = pairs['lineA']
        lineB = pairs['lineB']

        leftx, boty, rightx, topy = lineA[0]
        cv2.line(img, (leftx, boty), (rightx, topy), (0, 0, 255), 2)


        left_x, bot_y, right_x, top_y = lineB[0]
        cv2.line(img, (left_x, bot_y), (right_x, top_y), (0, 0, 255), 2)

    cv2.imwrite('linesImg.jpg', img)

Выходное изображение после рисования линий:

enter image description here

1 Ответ

0 голосов
/ 11 ноября 2019

Это в основном геометрическое задание , не специфичное для OpenCV.

Для каждой линии у вас есть две точки (x1, y1) и (x2, y2), которые уже используются в вашем getSlopeOfLine(line) метод. Вы можете обозначить каждую строку в форме:

ax + by + c = 0

Для этого используйте две известные точки линии:

(y1 - y2)x + (x2 - x1)y + (x1y2 - x2y1) = 0

Обратите внимание, что параллельные линии имеют одинаковые a и b, в то время как разные c.

А затем измерьте расстояние между любыми двумя из них (расстояние между непараллельными линиями равно нулю, поскольку они имеют точку пересечения):

d = abs(c2 - c1) / sqrt(a*a + b*b)

В евклидовой геометрии линия может быть обозначена несколькими способами, и один может лучше подходить для конкретной задачи.

В настоящее время вы оцениваете наклон линии, по формуле выше мы можем получить:

y = (-b / a)x - c / b

то же самое для (b теперь имеет другое значение)

y = kx + b

Или с использованием двух точек линии:

y = (x1 - x2) / (y1 - y2) * x + (x1y2 - x2y1)

Где k - наклон линии (tan(alpha)) и b сдвиг. Теперь вы просто сопоставляете параллельные линии (одна с закрытием k). Вы можете учесть сдвиг строки, чтобы объединить несколько параллельных линий в одну.

...