OpenCV выдает ошибку неверного аргумента при использовании addWeighted()

#python #opencv #python-imaging-library #overlay

#python #opencv #python-imaging-library #наложение

Вопрос:

Я пытаюсь добавить наложение поверх изображения, используя cv2.addWeighted(...) , но оно выдает следующую ошибку:

 dst = cv2.addWeighted(logo, alpha, overlay, 1-alpha, 0)
cv2.error: OpenCV(4.4.0) /tmp/pip-req-build-99ib2vsi/opencv/modules/core/src/arithm.cpp:691: error: (-5:Bad argument) When the input arrays in add/subtract/multiply/divide functions have different types, the output array type must be explicitly specified in function 'arithm_op'
 

Эта ошибка не имеет смысла для меня, потому что я проверил документы, и мои аргументы были подходящими. Это мой код.

 def overlay(path):
    logo = cv2.imread(path, cv2.IMREAD_UNCHANGED)
    alpha = logo[:, :, 3]

    overlay = np.zeros(logo.shape, dtype=np.uint8)
    overlay[:, :, 2] = alpha
    overlay[:, :, 3] = alpha

    alpha = 0.5

    dst = cv2.addWeighted(logo, alpha, overlay, 1-alpha, 0)

    pil_image = Image.fromarray(dst).convert('RGBA')

    return pil_image
 

Обновить

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

 dst = cv2.addWeighted(logo, alpha, overlay, 1 - alpha, 0, dtype=cv2.CV_32F).astype(np.uint8)
 

Это то, что происходит, когда я меняю цвет на наложении.

введите описание изображения здесь

Новый полный код:

 def overlay(path):
    logo = cv2.imread(path, cv2.IMREAD_UNCHANGED)
    alpha = logo[:, :, 3]

    overlay = np.zeros(logo.shape, dtype=np.uint8)
    overlay[:, :, 2] = alpha
    r = 0
    g = 255
    b = 0
    overlay[:, :, :3] = r, g, b
    # overlay[:, :, 3] = alpha

    alpha = 0.5

    dst = cv2.addWeighted(logo, alpha, overlay, 1 - alpha, 0, dtype=cv2.CV_32F).astype(np.uint8)

    pil_image = Image.fromarray(dst).convert('RGBA')

 

Комментарии:

1. Неясно, что такое контрольная доска.

2. @Hihikomori Это справедливо, но не могли бы вы сказать мне, как я могу поэкспериментировать с разными цветами?

3. Проверьте мой ответ, я его обновил.

4. @Hihikomori У него та же ошибка шахматной доски. Мне удалось получить представление об этом. Проверьте редактирование, чтобы увидеть его и мой новый полный код…

5. Добавить: наложение[:, :, 3] = 255, Контрольный кабан — это потому, что альфа-канал равен 0.

Ответ №1:

 dst = cv2.addWeighted(logo, alpha, overlay, 1-alpha, 0, dtype=cv2.CV_32F).astype(np.uint8)
 

Установите цвет на overlay:

 r = 10
g = 190
b = 100
a = 255
overlay[:, :] = r,g,b,a
 

Комментарии:

1. Ошибка типа: не удается обработать этот тип данных: (1, 1, 4), < u2

Ответ №2:

Логотип и объекты наложения имеют другой dtype, вызывающий ошибку синтаксического анализа. Чтобы исправить это, вы должны указать dtype вывода в команде addWeighted . Вот пример с выводом типа 32:

 dst = cv2.addWeighted(logo, alpha, overlay, 1-alpha, 0, dtype=cv2.CV_32F).astype(np.uint8)
 

Источники / Дополнительные ссылки:
https://github.com/Prasad9/ImageAugmentationTypes/issues/2

Комментарии:

1. Этот код выдает ошибку при моем преобразовании PIL, которая следует dst

2. Преобразуйте летнее время в uint8.

Ответ №3:

 F1=np.round(im1*0.3,0)
F2=np.round(im2*0.7,0)
F3=F1 F2
img=np.uint8(F3)
plt.imshow(img)
plt.show()