Нахождение отличного центра 2 объектов - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь найти центры из 2 квадратов на одном и том же изображении, которое выглядит следующим образом:

Input Image

Я могу обнаружить линии, которыесоставляют площадь.Мой вывод выглядит следующим образом:

Square image

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

import cv2
import numpy as np

img = cv2.imread('images/sq.png', 0)
gray = img

kernel_size = 5
blur_gray = cv2.GaussianBlur(gray,(kernel_size, kernel_size),0)
ret,thresh = cv2.threshold(blur_gray,100,255,0)

low_threshold = 50
high_threshold = 150
edges = cv2.Canny(thresh, low_threshold, high_threshold)

rho = 1  # distance resolution in pixels of the Hough grid
theta = np.pi / 180  # angular resolution in radians of the Hough grid
threshold = 3  # minimum number of votes (intersections in Hough grid cell)
min_line_length = 50  # minimum number of pixels making up a line
max_line_gap = 20 # maximum gap in pixels between connectable line segments
line_image = np.copy(img) * 0  # creating a blank to draw lines on

# Run Hough on edge detected image
# Output "lines" is an array containing endpoints of detected line segments
lines = cv2.HoughLinesP(edges, rho, theta, threshold, np.array([]),
                    min_line_length, max_line_gap)

for line in lines:
    for x1,y1,x2,y2 in line:
        cv2.line(line_image,(x1,y1),(x2,y2),(255,0,0),2)
        print("x1 {} y1 {} x2 {} y2 {}".format(x1,y1,x2,y2))

lines_edges = cv2.addWeighted(img, 0.5, line_image, 1, 0)

line_image_gray = cv2.cvtColor(line_image, cv2.COLOR_RGB2GRAY)

M = cv2.moments(line_image_gray)

cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])

cv2.circle(lines_edges, (cx, cy), 5, (0, 0, 255), 1)

cv2.imshow("res", lines_edges)
cv2.imshow("line_image", line_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

Ответы [ 2 ]

0 голосов
/ 29 января 2019

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

Вместо этого выполните процедуру, подобную этой:

  • Найти все черные (или почти черные) пиксели.Например, пиксели, в которых все три компонента RGB меньше 50. Это вернет квадраты сами по себе.

  • Примените морфологическое истончение (или скелет), чтобы превратить его в контур квадратов толщиной 1 пиксель.

  • Apply Houghпреобразование результата и обнаружение отрезков.

Правильная предварительная обработка упрощает настройку преобразования Хафа, поскольку будет более широкий диапазон параметров, дающих правильные результаты.

Затем найдите сегменты, которые начинаются или заканчиваются в одном и том же пикселе с небольшим допуском (т. Е. Начальная или конечная точки находятся в нескольких пикселях друг от друга), чтобы определить, какие из линий принадлежат друг другу втой же формы.

0 голосов
/ 29 января 2019

Вы можете использовать этот метод в сочетании со следующим кодом, чтобы узнать, какие линии являются частью одного квадрата:

Как проверить, пересекаются ли два сегмента?

Где 'lines' - это список распознанных линий, а intersects (line1, line2) - это функция, использующая процесс по вышеуказанной ссылке

squares = [[lines(1)]]    

for line1 in lines:
    for square in squares:
        for line2 in square:
            if line1 != line2:
                if intersects(line1, line2):
                    square.append(line1)
                else:
                    squares.append([line1])

Это дает вам "квадраты", содержащие строки, которыеявляются частью этого.Затем вы можете использовать функцию момента для каждого отдельно.

...