Ваша ошибка уже говорит о том, что не так, особенно эта часть:
FindContours supports only CV_8UC1 images when mode
Это означает, что это должно быть изображение в оттенках серого.Вы передаете изображение, загруженное с:
img = cv2.imread("Hair.jpg")
, которое по умолчанию возвращает изображение в CV_8UC3
или простыми словами, цветовом пространстве BGR.Даже если ваше изображение имеет только черный и белый.Решение, загрузите в оттенках серого:
img = cv2.imread("Hair.jpg", cv2.IMREAD_GRAYSCALE)
Кроме того, я замечаю, что это файл .jpg
, который может содержать некоторые артефакты, которые вам могут не понравиться / не понравиться.Чтобы удалить их, используйте порог:
ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
Надеюсь, это поможет вам, если нет, оставьте комментарий
Обновление:
findContours
Функция занимаетчерный как фон и белый как передний план.В твоем случае все наоборот.Но есть простой способ решить эту проблему, просто инвертировать изображение при его передаче:
_, contours, _ = cv2.findContours(255-img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
255 - максимальное значение, которое может иметь изображение, и оно превратит черный в белый, а белый в черный, давая вам правильный контур.