Как изменить непрозрачность ящиков (cv2.rectangle)? - PullRequest
1 голос
/ 06 июня 2019

Я рисую несколько прямоугольников в OpenCV и помещаю в них текст. Мой общий подход выглядит так:

# Draw rectangle    p1(x,y)    p2(x,y)    Student name box
cv2.rectangle(frame, (500, 650), (800, 700), (42, 219, 151), cv2.FILLED )
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(frame, name, (510, 685), font, 1.0, (255, 255, 255), 1

Пока все работает. Единственное, что непрозрачность во всех боксах на 100%. Мой вопрос: как я могу изменить непрозрачность?

Окончательный результат должен выглядеть следующим образом:

Desired outcome

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Я бы хотел добавить небольшую оптимизацию в ответ @HansHirse. Вместо создания холста для всего изображения мы можем сначала обрезать прямоугольник из изображения src, а затем поменять его местами с результатом cv2.addWeighted как:

import cv2
import numpy as np

img = cv2.imread("lena.png")

# First we crop the sub-rect from the image
x, y, w, h = 100, 100, 200, 100
sub_img = img[y:y+h, x:x+w]
white_rect = np.ones(sub_img.shape, dtype=np.uint8) * 255

res = cv2.addWeighted(sub_img, 0.5, white_rect, 0.5, 1.0)

# Putting the image back to its position
img[y:y+h, x:x+w] = res

enter image description here

1 голос
/ 06 июня 2019

РЕДАКТИРОВАТЬ: Хотя мое решение может работать, я настоятельно рекомендую использовать ответ ZdaR , поскольку он дает лучшие результаты с точки зрения правильного смешивания полей с нижележащими подизображениями.


По крайней мере, с моей точки зрения, встроенные функции, такие как cv2.rectangle, не поддерживают прозрачность даже на изображениях BGRA, см. здесь .Итак, как я описал в связанном ответе, единственная возможность добиться того, чего вы хотите, - это использовать функцию cv2.addWeighted.

Примером может быть:

import cv2
import numpy as np

# Load image
img = cv2.imread('images/paddington.png')

# Initialize black image of same dimensions for drawing the rectangles
blk = np.zeros(img.shape, np.uint8)

# Draw rectangles
cv2.rectangle(blk, (5, 5), (100, 75), (255, 255, 255), cv2.FILLED)

# Generate result by blending both images (opacity of rectangle image is 0.25 = 25 %)
out = cv2.addWeighted(img, 1.0, blk, 0.25, 1)

cv2.imshow('Image', img)
cv2.imshow('Rects', blk)
cv2.imshow('Output', out)
cv2.waitKey(0)
cv2.destroyAllWindows()

Оригинал Паддингтона img:

img

Промежуточное изображение для рисования прямоугольников на blk:

blk

И, конечный результат out:

out

После рисования прямоугольникови смешивая изображения, вы можете добавлять свои тексты, как и раньше.

Надеюсь, что поможет!

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