Что означает вывод findContours и как я могу его проанализировать? - PullRequest
2 голосов
/ 29 июня 2019

При использовании функции findContours() я получаю массив. Я не понимаю, что означают числа в массиве, а также что такое dtype.

код:

contour = str(cv2.findContours(edges, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE))
print(contour)

Выход:

([array([[[21, 21]],

       [[21, 90]],

       [[90, 90]],

       [[90, 21]]], dtype=int32), array([[[21, 22]],

       [[22, 21]],

       [[89, 21]],

       [[90, 22]],

       [[90, 89]],

       [[89, 90]],

       [[22, 90]],

       [[21, 89]]], dtype=int32), array([[[23, 23]],

       [[23, 88]],

       [[88, 88]],

       [[88, 23]]], dtype=int32), array([[[23, 24]],

       [[24, 23]],

       [[87, 23]],

       [[88, 24]],

       [[88, 87]],

       [[87, 88]],

       [[24, 88]],

       [[23, 87]]], dtype=int32)], array([[[-1, -1,  1, -1],
        [-1, -1,  2,  0],
        [-1, -1,  3,  1],
        [-1, -1, -1,  2]]], dtype=int32))

Как мне разобрать этот массив для последующего использования? Я планирую сделать приложение-черепаху, которое читает инструкции из файла, содержащего данные изображения. Я хочу знать, как я мог бы преобразовать это в упомянутые инструкции.

1 Ответ

1 голос
/ 29 июня 2019

cv2.findConturs ()

cnt,heirarchy = cv2.findContours(edged_img,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)     # Finding contours detection 

Этот метод возвращает два значения.контуры и иерархия.contours - это список всех контуров в изображении на языке Python.Каждый отдельный контур представляет собой массив Numpy (x, y) координат граничных точек объекта.

И в вашем случае он возвращает те же два значения, но разница в том, что вы анализируете его в строку иполучить его в одной переменной, что затрудняет понимание. ( Прочтите часть исправления )

Dtype

У каждого ndarray есть связанный объект типа данных (dtype).Этот объект типа данных (dtype) информирует нас о расположении массива ab


.Это означает, что он дает нам информацию о:

  • Типе данных (целое число, число с плавающей запятой, объект Python и т. Д.)
  • Размер данных (количество байтов)
  • Порядок байтов данных (с прямым или прямым порядком байтов)
  • Если тип данных является подмассивом, каковы его форма и тип данных.

Вв вашем случае это говорит о том, что данные внутри ndarray имеют тип int вместе с размером массива

Исправление вашего кода

В вашем коде проблема в этой части:

contour = str(cv2.findContours(edges, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE))

В этом случае вы анализируете значения, возвращаемые findCountours, в тип str.

cnt,heirarchy = cv2.findContours(edged_img,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)     # Finding contours detection 

Edit ::

Для рисования

Если вы хотите нарисовать все обнаруженные контуры, вы должны использовать метод cv2.drawContours().

cv2.drawContours(image,contours,-1,(255,0,0),2)        # Drawing the detected contours on the image.

Требуется 5 значений.Его первый аргумент является исходным изображением, второй аргумент - это контуры, которые должны быть переданы в виде списка Python, третий аргумент - это индекс контуров (полезно при рисовании отдельного контура. Чтобы нарисовать все контуры, передайте -1) и оставшиеся аргументыцвета, толщины и т. д.

Если вы хотите увидеть программу на python, которая скорее берет изображение и рисует на нем контуры (ИНФОРМАЦИЯ), то вы можете проверить этот открытый исходный код.

https://github.com/0xPrateek/ComputerVision-OpenCV3-Python/blob/master/contours%20detection.py

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...