Как мы можем добавить ограничивающую рамку вокруг вывода обнаружения Canny Edge? - PullRequest
1 голос
/ 09 января 2020

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

Выход Canny Edge -

enter image description here

Ограничивающий прямоугольник вокруг выходных данных canny edge -

enter image description here

Я пробовал следующий подход

contours,hierarchy=cv2.findContours(edged,cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)


boundRect = [None]*len(contours)
for i, c in enumerate(contours):
    contours_poly = cv2.approxPolyDP(c, 3, True)
    boundRect[i] = cv2.boundingRect(contours_poly)

for i in range(len(contours)):
    cv2.rectangle(image, (int(boundRect[i][0]), int(boundRect[i][1])), (int(boundRect[i][0]+boundRect[i][2]), int(boundRect[i][1]+boundRect[i][3])), (0,0,0), 2)

но при таком подходе каждый алфавит по отдельности получает ограничивающий прямоугольник.

Actual Ouptut -

enter image description here

Контурный вывод -

enter image description here

Ответы [ 2 ]

1 голос
/ 09 января 2020

Вы должны использовать функцию << <a href="https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_contours/py_table_of_contents_contours/py_table_of_contents_contours.html" rel="nofollow noreferrer"> cv2.findContours >>

Используется так:

contours = cv2.findContours(image, cv2.RETR_LIST, cv2.RETR_EXTERNAL) 
// contours : Numpy array with shape [number_contours, number_points,1,2]
// image: Your binary image as input
// cv2.RETR_EXTERNAL: Way to get your contours hierarchie
// cv2.CHAIN_APPROX_NONE: Approximation for optimisation

Иерархия контуров ie документация

Приближенная документация

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

Для обнаружения писем вы можете использовать алгоритм ICP , чтобы иметь возможность автоматически читать текст.

Для отслеживания ваших контуров используйте этот код:

import random
contours = sorted(contours, key = cv2.contourArea, reverse = True)
for i in range(len(contours)):
    contour = contours[i]
    random.seed(i)
    color = (255*random.random(),255*random.random(),255*random.random())
    cv2.drawContours(img,[contour], -1, color, 3)

Если на вашем изображении слишком много контуров для 1 элемента, вы должны использовать метод расширения для того, чтобы «закрыть» ваши контуры:

img_dilate = cv2.dilate(image, cv2.getStructuringElement(cv2.MORPH_RECT, (1, 1), (1, 1)))

Документация метода аппроксимации контура

1 голос
/ 09 января 2020

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

  1. Чтобы найти контуры : Попробуйте это

  2. Чтобы нарисовать ограничивающие рамки : Попробуйте это

...