提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
今天遇到一个新需求,就是去掉视频的水印,原理是先手动标注出水印的区域,再通过代码将区域进行模糊处理,代码如下:
import math
import cv2
capture=cv2.VideoCapture('1234.mp4')
height=capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
width=capture.get(cv2.CAP_PROP_FRAME_WIDTH)
count=capture.get(cv2.CAP_PROP_FRAME_COUNT)
fps=capture.get(cv2.CAP_PROP_FPS)
fourcc=cv2.VideoWriter_fourcc('m','p','4','v')
outVideo=cv2.VideoWriter()
outVideo.open('out.mp4',fourcc,fps,(int(width),int(height)),True)
def process_video(image):
# 需要注意的是第一个范围是y轴坐标的范围,第二个是x轴坐标的范围
# img=image[1160-90:1160, 509-193:509]
# img=cv2.GaussianBlur(img,(5,5),1.5)
# image[1160:1160+90, 509:509+193] = img
mask = cv2.imread( 'cat_inpainted.png' ,0)
new = cv2.imread( '344.png')
dst = cv2.inpaint(image, mask, 3 , cv2.INPAINT_NS) # 去掉水印
# 增加新的水印
h, w = dst.shape[:2] # 图片的高度和宽度
for i in range(329,h):
for j in range(236,w):
for k in range(3):
dst[i][j][k] = (int(dst[i][j][k]) + int(new[i][j][k])) if (int(dst[i][j][k]) + int(new[i][j][k]))<255 else 255
return dst
for i in range(int(count)):
ret,frame=capture.read()
if ret is True:
result=process_video(frame)
outVideo.write(result)
else:
break
print('进度:',str(math.ceil(i/count*100))+'%')
outVideo.release()
其中cat_inpainted.png,是水印的一张mask图片,如下如所示(手动标注出水印的区域):
344.png是新的水印