Работа с прозрачным фоном с помощью OpenCV

Я пытаюсь получить самый большой желтый объект на моем изображении. Я делаю следующее:

def findYellow(img):
    hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    lower_yellow, upper_yellow = np.array([18, 50, 90]), np.array([30, 255, 255])
    mask = cv2.inRange(hsv, lower_yellow, upper_yellow)
    _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    max_contour = max(contours, key = cv2.contourArea)
    mask = np.zeros(img.shape[:2], dtype = 'uint8')
    cv2.drawContours(mask, [max_contour], -1, (255), -1)
    result = cv2.bitwise_and(img, img, mask=mask)
    cv2.imwrite('result.png', result)
    return result

До этого момента все правильно.

Но теперь я хочу сделать то же самое, но с прозрачным фоном (так как теперь он был черным, mask = np.zeros()).

Я понимаю, что я должен работать с альфа-каналом, как mask = np.zeros((600,800, 4), dtype = 'uint8'), но появляется эта ошибка.

результат = cv2.bitwise_and (img, img, маска = маска) cv2.error: OpenCV(3.4.2) C:\Miniconda3\conda-bld\opencv-suite_1534379934306\work\modules\core\src\arithm.cpp:241: ошибка: (-215: Ошибка утверждения) (mtype == 0 || mtype == 1) && _mask.sameSize(*psrc1) в функции 'cv::binary_op'

Поэтому моя идея заключалась в том, чтобы преобразовать мой текущий образ BGR в BGRA, например b = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA), но снова не работает с той же ошибкой.

def findYellow(img):
    hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    lower_yellow, upper_yellow = np.array([18, 50, 90]), np.array([30, 255, 255])
    mask = cv2.inRange(hsv, lower_yellow, upper_yellow)
    _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    max_contour = max(contours, key = cv2.contourArea)
    mask = np.zeros((600, 800, 4), dtype = 'uint8')
    cv2.drawContours(mask, [max_contour], -1, (255), -1)
    b = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
    result = cv2.bitwise_and(b, b, mask=mask)
    cv2.imwrite('result.png', result)
    return result

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

Большое спасибо!!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
822
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если первый код правильный, сделайте следующее:

result = cv2.bitwise_and(img, img, mask=mask)
result = cv2.cvtColor(result, cv2.COLOR_BGR2BGRA)
result[:,:,3] = mask #Set mask as alpha channel
cv2.imwrite('result.png', result)
return result

Другие вопросы по теме