Ошибка при попытке получить область контура в opencv python - PullRequest
0 голосов
/ 28 января 2019

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

Я пытаюсь вычислить площадь по контурам, которые дают мне ошибку, например:

OpenCV(3.4.4) C:\projects\opencv-python\opencv\modules\imgproc\src\contours.cpp:195: error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in function 'cvStartFindContours_Impl'

Итак, почему findContours не поддерживает мое изображение?

Другойподход:

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

Итак, возможна ли эта техника?Или, пожалуйста, предложите какое-нибудь решение для вышеуказанной ошибки?

Мое изображение:

Hair

Myкод:

import cv2
import numpy as np

img = cv2.imread("Hair.jpg")

_, contours, _ = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

c = max(contours, key = cv2.contourArea)

cv2.drawContours(img, [c], -1, (255,255, 255), -1) 

area = cv2.contourArea(c)
print(area)

cv2.imshow("contour", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

1 Ответ

0 голосов
/ 28 января 2019

Ваша ошибка уже говорит о том, что не так, особенно эта часть:

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 - максимальное значение, которое может иметь изображение, и оно превратит черный в белый, а белый в черный, давая вам правильный контур.

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