Alpha channel overlay back to RGB
I need to overlay a watermark on a video stream. I am using av for flicking through the frames, but opencv for the image processing. It's a the point where I want to hand a frame back to av that I get a problem.
Here is an annotated example of what I am trying to do, and where I am having problems
container = av.open('video.mp4')
for frame in container.decode(video=0):
background = frame.to_ndarray(format="bgr24")
(h, w) = background.shape[:2]
background = np.dstack([background, np.ones((h, w), dtype="uint8") * 255])
overlay = np.zeros((h, w, 4), dtype="uint8")
y1 = watermark_top_margin
y2 = watermark_top_margin + watermark_height
x1 = w - watermark_width - watermark_right_margin
x2 = w - watermark_right_margin
overlay[y1:y2, x1: x2] = resized_watermark
# blend the two images together using transparent overlays
output = background.copy()
cv2.addWeighted(overlay, watermark_alpha, output, 1.0, 0, output)
# blend the two images together using transparent overlays
output = background.copy()
cv2.addWeighted(overlay, watermark_alpha, output, 1.0, 0, output)
#This is the problem right here vvvvvvvvvvvvvvvvvvvvvv
output = cv2.cvtColor(output,cv2.COLOR_RGBA2RGB)
#Here is the problem ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The colour conversion loses any work I have done in the alpha channel. So the frame looks exactly as it did before I overlay the image.
new_frame = av.video.VideoFrame.from_ndarray(output, format="bgr24")
So my question is this. How can I convert the image back to RGB format to create an av frame without losing the alpha channel information? This needs to be performat as it is happening in real time.
you probably need a bgr (or rgb, who knows?) watermark, and an rgb image, and a single addWeighted() call between them. (also the weights must add up to 1).
you don't need opencv for that all . weighted blending can be done simply using numpy
The addWeighted call is in there and working just fine. The overlay works just fine. When I convert it using cvtColor the overlay is lost.
Well that's cleared that up.
Any chance of some code, or a url?
Do you have an image to see what is looked like?
Why do you have 2 duplicated?