Как измерить угол между двумя линиями в одном и том же изображении, используя python opencv? - PullRequest
4 голосов
/ 19 июня 2019

Я обнаружил линию границы полосы, которая не является прямой, используя грубое преобразование, а затем выделил эту линию отдельно.Затем смешивается с другим изображением, которое имеет прямую линию.Теперь мне нужно вычислить угол между этими двумя линиями, но я не знаю координаты этих линий.Поэтому я попытался с кодом, который дает координаты вертикальных линий, но он не может конкретно определить эти координаты.Есть ли способ измерить угол между этими линиями?Вот мой код вычисления координат и смешанное изображение с двумя строками

import cv2 as cv
import numpy as np

src = cv.imread("blended2.png", cv.IMREAD_COLOR)

if len(src.shape) != 2:
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
else:
    gray = src

gray = cv.bitwise_not(gray)
bw = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 15, -2)

horizontal = np.copy(bw)
vertical = np.copy(bw)

cols = horizontal.shape[1]
horizontal_size = int(cols / 30)

horizontalStructure = cv.getStructuringElement(cv.MORPH_RECT, (horizontal_size, 1))
horizontal = cv.erode(horizontal, horizontalStructure)
horizontal = cv.dilate(horizontal, horizontalStructure)

cv.imwrite("img_horizontal8.png", horizontal)

h_transpose = np.transpose(np.nonzero(horizontal))
print("h_transpose")
print(h_transpose[:100])

rows = vertical.shape[0]
verticalsize = int(rows / 30)
verticalStructure = cv.getStructuringElement(cv.MORPH_RECT, (1, verticalsize))
vertical = cv.erode(vertical, verticalStructure)
vertical = cv.dilate(vertical, verticalStructure)

cv.imwrite("img_vertical8.png", vertical)

v_transpose = np.transpose(np.nonzero(vertical))

print("v_transpose")
print(v_transpose[:100])

img = src.copy()

# edges = cv.Canny(vertical,50,150,apertureSize = 3)
minLineLength = 100
maxLineGap = 200
lines = cv.HoughLinesP(vertical,1,np.pi/180,100,minLineLength,maxLineGap)
for line in lines:
    for x1,y1,x2,y2 in line:
        cv.line(img,(x1,y1),(x2,y2),(0,255,0),2)

cv.imshow('houghlinesP_vert', img)
cv.waitKey(0)

enter image here

1 Ответ

4 голосов
/ 20 июня 2019

Один из подходов состоит в том, чтобы использовать преобразование Хафа для определения линий и получения угла каждой линии.Угол между этими двумя линиями затем можно найти, вычтя разницу между двумя линиями.

Мы начнем с выполнения среднего арифметического с использованием np.mean, чтобы, по существу, порогировать изображение, что приводит к этому.

image = cv2.imread('2.png')

# Compute arithmetic mean
image = np.mean(image, axis=2)

enter image description here

Теперь мы выполняем skimage.transform.hough_line для обнаружения линий

# Perform Hough Transformation to detect lines
hspace, angles, distances = hough_line(image)

# Find angle
angle=[]
for _, a , distances in zip(*hough_line_peaks(hspace, angles, distances)):
    angle.append(a)

enter image description here

Далее мы получаем угол для каждой линии и находим разницу для получения нашего результата

# Obtain angle for each line
angles = [a*180/np.pi for a in angle]

# Compute difference between the two lines
angle_difference = np.max(angles) - np.min(angles)
print(angle_difference)

16.08938547486033

Полный код

from skimage.transform import (hough_line, hough_line_peaks)
import numpy as np
import cv2

image = cv2.imread('2.png')

# Compute arithmetic mean
image = np.mean(image, axis=2)

# Perform Hough Transformation to detect lines
hspace, angles, distances = hough_line(image)

# Find angle
angle=[]
for _, a , distances in zip(*hough_line_peaks(hspace, angles, distances)):
    angle.append(a)

# Obtain angle for each line
angles = [a*180/np.pi for a in angle]

# Compute difference between the two lines
angle_difference = np.max(angles) - np.min(angles)
print(angle_difference)
...