#python #opencv
#python #opencv
Вопрос:
У меня есть следующий код:
import cv2
img = cv2.imread('image.png')
# Convert image to grayscale image
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Convert the grayscale image to binary image
_, threshold = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)
print(threshold)
# [[255 255 255 ... 255 255 255]
# [255 255 255 ... 255 255 255]
# [255 255 255 ... 255 255 255]
# ...
# [ 0 0 0 ... 0 0 0]
# [ 0 0 0 ... 0 0 0]
# [ 0 0 0 ... 0 0 0]]
_, contours = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print(contours)
# [[[-1 -1 -1 -1]]]
Почему я получаю такой странный вывод для контуров? Нижняя половина моего изображения черная, а верхняя половина белая. Я ожидал увидеть, contours = [[height, 0, width, height / 2]]
где (height, 0)
находится нижний левый угол, а (width, height / 2)
— верхний правый угол черного прямоугольника на image.png
.
Комментарии:
1. Потому что то, что вы храните в переменной с именем
contours
, — это не количество, а иерархия. Прочитайте документацию .
Ответ №1:
Вместо этого у меня должна быть эта строка кода (см. Документы):
contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
Комментарии:
1. Просто добавлю, что одна из причин, по которой это несколько сбивает с толку, заключается в том, что в более старых версиях OpenCV
findCountours()
возвращалось два значения. Затем в более поздних версиях он вернул три. Теперь в версии 4.0 он вернулся к двум.