[python opencv 计算机视觉零基础到实战]二十二、给视频制作浮动的带感水印
一、学习目标
- 了解浮游水印如何实现
- 了解鬼畜水印效果如何实现
二、了解使用OpenCV制作视频特效
2.1 读取视频
首先我们需要准备一个视频素材,我的路径是‘D:\test\02.mp4’,使用VideoCapture进行读取。代码如下:
capture2=cv2.VideoCapture(r'D:\test\02.mp4')
当然,在开头还需要引入库:
import cv2
随后我们创建一个窗口,防止我们的内容过于过大会让我们观察不便。代码如下:
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
接下来我们需要读取图片的每一帧,每一帧使用read方法进行读取返回一个res与图片img。代码如下:
r,img=capture2.read()
我们现在只需要加个循环就可以每一帧读取图片进行播放了。代码如下:
while True:
r,img=capture2.read()
if r==False:
break
cv2.imshow("Image", img)
k=cv2.waitKey (40)
if k==27:
break
运行一下代码可以看到视频:
好了,基本没啥事就可以开始了。
2.2 了解需求
我们先看一下我们要完成的效果。
以上图片中红色区域的白色文字则是我需要添加的水印,并且水印可以游走于整个屏幕,不规则的进行运动。
2.3 使用putText先加点内容
我们在前几节课程有了解putText而已在视频上进行文字的添加,并且putText方法可以指定文字添加的位置。我们首先先在固定位置添加文本信息。在之前我们要使程序更灵活,我们先创建几个变量作为putText方法的参数。代码如下:
#字体
fontx=300
fonty=0
fontpos=(fontx,fonty)#字体所在的坐标
#字体宽度与厚度
font_size=1
font_bold=1
#字体内容
font_text=r'Blog 1_bit @ebaina @csdn'
#字体颜色
B_=255
G_=255
R_=255
font_color=(B_,G_,R_)
font=cv2.FONT_HERSHEY_SIMPLEX#字体
随后将参数传入到putText方法中:
cv2.putText(img,font_text,fontpos, font,font_size,font_color,font_bold)
这时我们运行程序可以看到文字信息已经在视频中出现,那putText代码添加到哪个位置呢?putText方法添加到视频的循环读取帧中,对每一帧的图片进行处理,将字体添加到每一帧的图片中即可。这一小阶段的完整代码如下:
import cv2
#字体
fontx=300
fonty=0
fontpos=(fontx,fonty)#字体所在的坐标
#字体宽度与厚度
font_size=1
font_bold=1
#字体内容
font_text=r'Blog 1_bit @ebaina @csdn'
#字体颜色
B_=255
G_=255
R_=255
font_color=(B_,G_,R_)
font=cv2.FONT_HERSHEY_SIMPLEX#字体
while True:
r,img=capture2.read()
if r==False:
break
cv2.putText(img,font_text,fontpos, font,font_size,font_color,font_bold)
cv2.imshow("Image", img)
k=cv2.waitKey (40)
if k==27:
break
2.4使用水印内容在视频中游动
接下来我们开始对视频添加的文本信息当作水印开始在视频中游动,这种游动的视频可以维护自己的原创性,防止不法的自媒体工作者抄袭、搬运等。
想要使文本信息能够浮动,我们首先可以实现文本信息的上下移动。上下移动则是y轴的上下增加增加。我们可以在每一帧的图片中,给文本信息增加一个单位。在OpenCV中左上角的x与y值是0和0,宽度最大长度为当前帧图片的width,高度最大高度为图片的height,如图:
那么这时,我们可以先控制上下移动,也就是y周的持续增加。由于之前我们已经建立好了fonty这一个y轴坐标值的变量。此时我们只需要在帧读取的循环中加入如下代码即可:
fonty+=1
fontpos=(fontx,fonty)
这个时候我们运行程序,发现我们的文本信息从上往下运动,但是会超过最底部边界。那么在这时就可以增加一个半段,弱大于图片的height则进行减法,若小于0则变成加法。我们可以使用一个状态开关,我们在循环读帧之前创建一个变量fIsUp,随后在循环中读取每一帧的高度:
vimg_height=img.shape[0]
判断fonty是否大于vimg_height或者等于0,代码如下:
#字体漂浮上下开关
if fonty==0:
fIsUp=0
elif fonty==vimg_height:
fIsUp=1
这时开关如果是上浮则剪,下浮则加,代码如下:
#上下移动就按
if fIsUp:
fonty-=1
else:
fonty+=1
此时我们运行程序,发现y坐标可以上下进行移动,但是x轴的移动却不行。那如何增加x轴的移动呢?原理一样,使用一个开关表示浮动左右是否开启,如果开启则往一个方向,不开启则往另外一个方向。此时两个浮动都开启,那么文本就可以在整个视频中像一片羽毛一样开始移动了。代码如下,首先设置左移开关:
vimg_width=img.shape[1]
#字体漂浮左右开关
if fontx==0:
fIsleft=1
elif fontx==vimg_width:
fIsleft=0
然后是左右移动的计算:
#左右移动计算
if fIsleft:
fontx+=1
else:
fontx-=1
这一部分的代码如下:
import cv2
import numpy as np
import random
#字体
fontx=300
fonty=0
fontpos=(fontx,fonty)#字体所在的坐标
#字体宽度与厚度
font_size=1
font_bold=1
#字体内容
font_text=r'Blog 1_bit @ebaina @csdn'
#字体颜色
B_=255
G_=255
R_=255
font_color=(B_,G_,R_)
#左右开关 0关闭 1开启
fIsleft,fIsUp=0,0
font=cv2.FONT_HERSHEY_SIMPLEX#字体
capture2=cv2.VideoCapture(r'D:\test\02.mp4')
while True:
r,img=capture2.read()
if r==False:
break
#宽高获取
vimg_height=img.shape[0]
vimg_width=img.shape[1]
#字体漂浮左右开关
if fontx==0:
fIsleft=1
elif fontx==vimg_width:
fIsleft=0
#字体漂浮上下开关
if fonty==0:
fIsUp=0
elif fonty==vimg_height:
fIsUp=1
#左右移动计算
if fIsleft:
fontx+=1
else:
fontx-=1
#上下移动就按
if fIsUp:
fonty-=1
else:
fonty+=1
fontpos=(fontx,fonty)#字体位置悬浮
print('fontpos:',fontpos,' wh:',img.shape,' f:',vimg_width)
cv2.putText(img,font_text,fontpos, font,font_size,font_color,font_bold)
cv2.imshow("Image", img)
k=cv2.waitKey (40)
if k==27:
break
cv2.waitKey (0)
cv2.destroyAllWindows()
以上代码中可以使用:
print('fontpos:',fontpos,' wh:',img.shape,' f:',vimg_width)
查看具体的文本位置的变换,当文本坐标x等于图片宽度时立即减少。同理,文本高度值也是一样:
2.5使用随机更带感
我们在前几节中了解了,其实文本颜色可以进行随机变换,更加好看,并且大小值也可以进行变换。实现起来很简单,只需要import random
,给予数值随机数即可。代码如下,添加在帧读取中:
#字体颜色随机
B_=random.uniform(0,255)
G_=random.uniform(0,255)
R_=random.uniform(0,255)
font_color=(B_,G_,R_)
#字体大小,厚度
font_size=random.uniform(0,5)
整个项目完整代码如下:
import cv2
import random
#字体
fontx=300
fonty=0
fontpos=(fontx,fonty)#字体所在的坐标
#字体宽度与厚度
font_size=1
font_bold=1
#字体内容
font_text=r'Blog 1_bit @ebaina @csdn'
#字体颜色
B_=255
G_=255
R_=255
font_color=(B_,G_,R_)
#左右开关 0关闭 1开启
fIsleft,fIsUp=0,0
font=cv2.FONT_HERSHEY_SIMPLEX#字体
capture2=cv2.VideoCapture(r'D:\test\02.mp4')
while True:
r,img=capture2.read()
r3,img3=capture3.read()
if r==False:
break
#宽高获取
vimg_height=img.shape[0]
vimg_width=img.shape[1]
#字体漂浮左右开关
if fontx==0:
fIsleft=1
elif fontx==vimg_width:
fIsleft=0
#字体漂浮上下开关
if fonty==0:
fIsUp=0
elif fonty==vimg_height:
fIsUp=1
#左右移动计算
if fIsleft:
fontx+=1
else:
fontx-=1
#上下移动就按
if fIsUp:
fonty-=1
else:
fonty+=1
fontpos=(fontx,fonty)#字体位置悬浮
#字体颜色随机
B_=random.uniform(0,255)
G_=random.uniform(0,255)
R_=random.uniform(0,255)
font_color=(B_,G_,R_)
#字体大小,厚度
font_size=random.uniform(0,5)
print('fontpos:',fontpos,' wh:',img.shape,' f:',vimg_width)
cv2.putText(img,font_text,fontpos, font,font_size,font_color,font_bold)
cv2.imshow("Image", img)
k=cv2.waitKey (40)
if k==27:
break
cv2.waitKey (0)
cv2.destroyAllWindows()
效果如下:
这个时候水印文本会不断的更改位置,并且变换颜色和大小。
三、总结
- 了解了如何灵活运用技术,使视频添加浮动水印
- 了解了如何使用随机数使文本信息更带感
- 分享
- 举报
-
浏览量:6755次2021-01-05 18:32:12
-
浏览量:4754次2021-01-19 16:45:32
-
浏览量:5222次2020-12-29 19:37:20
-
2020-12-14 18:16:24
-
浏览量:4597次2021-01-14 01:47:31
-
浏览量:4953次2021-01-11 15:33:50
-
浏览量:5623次2020-12-21 16:50:21
-
浏览量:7271次2020-12-21 20:12:30
-
2021-01-19 23:49:13
-
浏览量:4417次2021-01-08 01:04:31
-
2021-01-12 21:31:51
-
浏览量:4796次2021-01-26 19:00:57
-
浏览量:5449次2021-01-05 22:14:42
-
浏览量:6067次2020-12-29 14:13:00
-
浏览量:5613次2021-01-02 22:50:35
-
浏览量:5229次2021-01-12 23:46:34
-
浏览量:6172次2020-12-25 23:18:24
-
浏览量:9372次2020-12-18 22:21:10
-
浏览量:8697次2020-12-16 22:21:43
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
1_bit
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明