Я выполнил еще несколько работ по выводу list(contour)
, чтобы получить представление о контуре на основе ответа, предоставленного выше математическим файлом.
1) Я сделал ошибку на моем тестовом изображении. Я думал, что это было двоичное изображение, в то время как на самом деле это было изображение в градациях серого с некоторыми другими цветами. (Спасибо математическому кофе) Поэтому я изменил изображение на чисто черно-белое изображение, чтобы получить только один контур и снова протестировать. На этот раз list(contour)
дал результат 4 значений, которые при рисовании на изображении были четырьмя углами этого поля.
Поэтому, когда мы используем функцию 'cv.DrawContours', рисуются линии, соединяющие все эти вершины. Поэтому я сделал предположение, что cv.FindContours хранит положение вершин контура, который на самом деле является многоугольником.
2) Чтобы проверить снова, я взял другое изображение, которое имеет Т-образную форму.
Для этого я ожидаю список из 8 значений, которые являются 8 углами T.
`list (contour) 'печатает следующий список, который содержит 10 значений. (2 дополнительных значения могут быть из-за ошибок в моем рисунке)
[(92, 58), (92, 108), (174, 108), (175, 109), (175, 239), (225, 239), (225, 109), (226, 108), (285, 108), (285, 58)]
Это означает, что cv.FindContours создает объект cvseq. Внутри него хранятся значения, как я предполагал выше.
3) Приведенные выше примеры находят только один контур. В каком состоянии будут обнаружены несколько контуров? Я не совсем понимал концепцию множественных связанных последовательностей , как объяснил математический. Чтобы проверить это, я взял третье изображение.
Теперь cv.FindContours находит три контура. Помните, что каждый контур представляет собой список из 4 углов коробок. Эти три списка хранятся в одном объекте cvseq, и указатель указывает только на первый контур, т. Е. На список вершин только первого блока. Таким образом, с помощью приведенного выше кода, углы только одного прямоугольника.
Чтобы получить список вторых вершин, мы используем функцию contour.h_next (Благодаря математическому.coffee я до сих пор не знал его функции). Теперь он указывает на контур второй рамки. Таким образом мы перебираем весь список в нем.
Итак, я добавил простой цикл while:
while contours:
print list(contours)
for i in list(contours):
cv.Circle(img,i,5,(0,0,255),3)
contours = contours.h_next()
И я получил три списка, соответствующих углам трех ящиков:
[(196, 237), (196, 279), (357, 279), (357, 237)]
[(141, 136), (141, 201), (346, 201), (346, 136)]
[(33, 39), (33, 92), (206, 92), (206, 39)]
И выводимое изображение:
Таким образом, вы можете ожидать, что будет выводиться из круга, "который имеет большое количество вершин".
Ну, теперь все просто. Я не мог понять контурные значения. Вот почему все это безобразие. Спасибо.
ОБНОВЛЕНИЕ - 1:
Более подробную информацию о контуре в новом cv2
модуле можно найти здесь: Контуры -1: Начало работы
ОБНОВЛЕНИЕ - 2:
Все эти объяснения верны в отношении cv2.CHAIN_APPROX_SIMPLE. Но если вместо этого мы используем cv2.CHAIN_APPROX_NONE, мы получим все точки на контуре. Это подробно объясняется примерами в этой статье: Контуры - 5: Иерархия