视频处理 --- 视频加水印
1. 模块下载
pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple
2. 加普通图片
import cv2
# 设置视频文件路径和水印图片路径
video_path = 'test.mp4'
watermark_path = 'img.png'
output_path = 'output.mp4'
# 读取视频和水印图片
cap = cv2.VideoCapture(video_path)
watermark = cv2.imread(watermark_path, cv2.IMREAD_UNCHANGED)
# 获取视频的宽度、高度和帧速率
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
# 设置水印的位置
watermark_scale = 1  # 水印大小为视频分辨率的30%
watermark_width = int(frame_width * watermark_scale)
watermark_height = int(watermark.shape[0] * watermark_scale)
watermark_x = frame_width - watermark_width
watermark_y = frame_height - watermark_height
# 调整水印大小
watermark = cv2.resize(watermark, (watermark_width, watermark_height))
# 创建视频写入对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))
while cap.isOpened():
    ret, frame = cap.read()
    if ret:
        # 将水印图片叠加到视频帧上
        frame[watermark_y:watermark_y + watermark_height, watermark_x:watermark_x + watermark_width] = watermark
        # 写入帧到输出视频
        out.write(frame)
    else:
        break
# 释放资源
cap.release()
out.release()
3. 加透明背景图水印
import os
import cv2
from PIL import Image
import numpy as np
# 设置视频文件路径和水印图片路径
video_path = 'H104拍屏.mp4'
watermark_path = 'shui_yin.png'
output_path = 'output.mp4'
# 读取视频和水印图片
cap = cv2.VideoCapture(video_path)
watermark = cv2.imread(watermark_path, cv2.IMREAD_UNCHANGED)
# 获取视频的宽度、高度和帧速率
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
# 设置水印的位置
watermark_scale = 1
watermark_width = int(frame_width * watermark_scale)
watermark_height = int(watermark.shape[0] * watermark_scale)
# 调整水印大小
# watermark = cv2.resize(watermark, (watermark_width, watermark_height))
# 创建视频写入对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))
def merge_image(bg, img2, top_left):
    # 调整背景图大小
    bg = cv2.resize(bg, (frame_width, frame_height))
    # 打开背景
    bg = Image.fromarray(bg.astype('uint8')).convert('RGB')
    # 创建透明底图
    target = Image.new('RGBA', (frame_width, frame_height), (0, 0, 0, 0))
    # 打开水印
    img2_scale = img2.copy()
    img2_scale = cv2.resize(img2_scale, (frame_width, frame_height))
    img2_scale = Image.fromarray(img2_scale.astype('uint8')).convert('RGBA')
    # 分离透明通道
    r, g, b, a = img2_scale.split()
    # 将背景贴到底图
    bg.convert("RGBA")
    target.paste(bg, (0, 0))
    # 将水印贴到底图
    img2_scale.convert("RGBA")
    startX = top_left[0]
    startY = top_left[1]
    target.paste(img2_scale, (startX, startY), mask=a)
    target = np.array(target)
    return target
while cap.isOpened():
    ret, frame = cap.read()
    if ret:
        res = merge_image(frame, watermark, [0, 0])
        frame = cv2.cvtColor(res,cv2.COLOR_RGBA2BGR)
        # print(frame.shape)
        # frame[:watermark_height, :watermark_width] = res
        # cv2.imshow("video",res)
        # cv2.waitKey(0)
        out.write(frame)
    else:
        break
# 释放资源
cap.release()
out.release()
    python防脱发技巧

                
            
        
浙公网安备 33010602011771号