一、背景知识
1.1、headblur简介
追踪人脸打马赛克需要使用headblur函数。
调用语法:
headblur(clip,fx,fy,r_zone,r_blur=None)
说明:
其中参数fx和fy是两个函数,该函数带参数t,用于确认t时刻需要模糊化范围的中心点位置,moviepy将对以中心点为圆心半径r_zone的圆范围内的图像进行模糊化处理,模糊化处理时的卷积核大小由r_blur指定。关于r_blur参数的作用请大家参考《moviepy音视频剪辑:headblur的参数r_blur卷积核的功能作用及用途》。
1.2、manual_tracking简介
manual_tracking是moviepy的工具模块moviepy.video.tools.tracking提供的函数,该模块还提供了autoTrack函数和findAround,其中findAround是供manual_tracking和autoTrack使用,autoTrack是根据匹配模式自动选择跟踪对象,后面再介绍。manual_tracking用于手工选择要跟踪的位置。
调用语法:
manual_tracking(clip, t1=None, t2=None, fps=None, nobjects = 1, savefile = None)
说明:
※ t1、t2:用于指定需要进行跟踪的剪辑位置范围,如果t2为None,则只跟踪t1位置的帧,如果t1、t2都为None则跟踪整个剪辑
※ fps:该参数不是剪辑本身的fps,而是跟踪时剪辑的以秒为单位的时间范围内需要显示的帧数,即在跟踪时,每秒的时间长度范围内需要抽取fps参数设定的帧数图像来显示,如t1和t2定义的剪辑跟踪长度为30秒,fps设置为2,则跟踪时moviepy会从剪辑中每秒抽取2帧显示,跟踪者需要对60帧图像标记跟踪位置
※ nobjects :每帧中需要跟踪位置的个数,缺省为1,当需要跟踪多个对象时设置为实际跟踪对象的个数
※ savefile :跟踪数据需要写入文件时由该参数指定保存文件的名称,可以带路径。
※ manual_tracking会根据参数 t1、t2以及fps和nobjects 设定,将剪辑 t1到t2位置的子剪辑逐帧显示出来,让操作者通过鼠标点击跟踪对象如人脸的中心,manual_tracking记下点击位置的xy坐标和对应剪辑的位置t,直到该时间段内所有帧都会,返回值为一个Trajectory对象组成的列表,列表元素的个数为nobjects参数的值指定。
1.3、Trajectory简介
Trajectory应该是moviepy专门为tracking和headblur设计的类,该类包括如下属性:
※ tt:跟踪的时间点列表
※ xx、yy:跟踪点的横坐标列表和纵坐标列表
※ xi、yi:跟踪点的横坐标插值和纵坐标插值,类型为Interpolator,该类型会调用numpy的interp函数进行插值处理
二、代码实现
`imgList = [, , , , , , ]``qimgList = [QtBGR2RGB,QtBGR2RGBA,QtBGR2BGRA,QtRGB2BGR,QtBGR2RGB,QtRGB2BGRA,QtRGB2RGBA]``Format_RGB32 情况下:``imshow``颜色完全正常的:RGB2RGBA BGR2BGRA cvImgCopy``颜色发生变化:BGR2RGB BGR2RGBA RGB2BGRA RGB2BGR``PyQt:``完全正常:QtRGB2RGBA``颜色正常但内容被裁减:QtBGR2BGRA``颜色红蓝交换其他正常:RGB2BGRA``其他都是乱码:QtBGR2RGB QtBGR2RGBA QtRGB2BGR QtBGR2RGB cvImgCopy``if __name__ == '__main__':` `movie_in = sys.argv[1]` `if len(sys.argv) == 3: #参数指定的视频文件名` `subclip_s = float(sys.argv[2]) #是否指定了只加载视频的前n秒,n为浮点数` `else:subclip_s = None` `clip = VideoFileClip(movie_in)` `if subclip_s is not None: clip = clip.subclip(0, subclip_s)` `tracking = moviepy.video.tools.tracking.manual_tracking(clip,0,3, fps=2)[0] #取返回的第一个跟踪对象,实际上nobjects使用的是默认值1,因此也就一个跟踪对象` `clip_blurred = clip.fx(vfx.headblur, tracking.xi, tracking.yi, 30) #进行模糊化处理,圆半径设置为30像素` `clip_blurred.write_videofile(movie_in + '_blurred_tofxfy.mp4')`
三、执行效果
启动参数设置为F:\video\zbl1.mp4 54
,对应视频为卓别林《淘金记》,加载视频的前4秒,跟踪设置为整个剪辑跟踪,fps为2,因此需要选择8个帧的跟踪数据。最终输出后的视频动画:
更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。
本文转转自微信公众号老猿Python原创https://mp.weixin.qq.com/s/oEJhFHUnmEQbHhvvWk8qIA,如有侵权,请联系删除。