python实现视频ai换脸源代码,ai换脸视频生成
留胡子的绿茶/L
head.jpgface.jpgoutput.jpg
#-* -编码:utf-8-* -
#版权2015年年伊格迪丘伯爵
#
#特此许可任何人免费获取副本
# of thioftwareandassociateddocumentationfiles(软件),以交易
# inthesoftwarewarewithouttrestriction,包括没有限制权利
#使用、复制、修改、合并、发布、分发、再许可和/或销售
#软件的副本,以及操作人员的家庭软件
#按照以下条件3360提供
#
#包含上述版权通知和许可通知
#软件得所有副本或实体部分。
#
#软件按"原样"提供,不含任何形式的明示担保
#或隐含,包括包括但不限于其他担保
#适销性,适合特定用途完美的未来e和不侵权。在…里
# noeventshallauthorsorpyrightholders被认为是版权所有者,
#损害赔偿或其他责任,无论是在合同、侵权或
#否则,产生于、出于与软件相关联
# useorotherdealingsinthesoftware。
thisithecodehindtheswitchedsblogpost:
马修earl.github.io/2015/07/28街3358号交换- eds-with-python /
见下面代码的解释。
torunthecriptyou llneedtoinstalldlib(http://dlib . net)包括其
sourceforge:
3358来源forge.net/projects/DC lib/files/dlib/v 18.10/shape _ predictor _ 68 _ face _ landmarks。dat。bz2
用" bunzip2 "解压缩,并将"预测器_路径"更改为" torefertothisfile "
脚本是这样运行的:/faceswap.py
如果成功,一个文件" output.jpg "将与面部特征一起产生
来自`
从""中替换了。
数组
sys.argv=[faceswap.py , head.jpg , face.jpg]
# PREDICTOR _ PATH=/home/matt/DLI b-18.16/shape _ PREDICTOR _ 68 _ face _ landmarks。“日期”
PREDICTOR_PATH= ./dat/shape _ predictor _ 68 _ face _ landmarks。“日期”
比例因子=1
FEATHER_AMOUNT=11
FACE_POINTS=list(范围(17,68))
MOUTH_POINTS=list(range(48,61))
RIGHT _ BROW _ POINTS=list(range(17,22))
LEFT_BROW_POINTS=list(range(22,27))
RIGHT_EYE_POINTS=list(range(36,42))
LEFT_EYE_POINTS=list(范围(42,48))
NOSE_POINTS=list(range(27,35))
JAW_POINTS=list(范围(0,17))
#用于排列图像的点数。
ALIGN_POINTS=(左眉点右眼点左眼点
右眉分鼻分口分)
#第二幅图像中要叠加在第一幅图像上的点。每个的凸包
#元素将被覆盖。
OVERLAY_POINTS=[
左_眼_点右_眼_点左_眉_点右_眉_点,
鼻子_分嘴巴_分,
#色彩校正期间使用的模糊量,作为的一部分
#瞳孔距离。
颜色_正确_模糊_FRAC=0.6
检测器=dlib。get _ frontier _ face _ detector()
预测值=dlib。形状预测器(预测器路径)
类太多面(异常):
及格
类别无表情(例外):
及格
def get_landmarks(im):
如果透镜(矩形)1:
如果len(rects)==0:
定义注释_地标(即时消息,地标):
对于idx,指向枚举(地标):
pos=(点[0,0],点[0,1])
cv2.putText(im,str(idx),pos,
fontFace=cv2 .FONT_HERSHEY_SCRIPT_SIMPLEX,
fontScale=0.4,
color=(0,0,255))
cv2.circle(im,pos,3,color=(0,255,255))
def draw_convex_hull(im,points,color):
points=cv2 .凸包(点数)
cv2。fillclunpoly(im,points,color=color)
def get_face_mask(即时消息,地标):
对于覆盖点中的组:
draw_convex_hull(im,
地标[群],
color=1)
定义转换点(点1,点2):
返回仿射变换[s * R T],使得:
总和s*R*p1,i T - p2,i^2
被最小化。
#通过减去形心来解决古代希腊的强盗问题
#标准差,然后使用德拉贡诺夫狙击步枪(Snayperskaya Vinyovka Dragunov的缩写)来计算旋转。看见
#以下为更多详情:
# https://en.wikipedia.org/wiki/Orthogonal_Procrustes_problem
点1=点1。as类型(numpy。浮动64)
点2=点2。as类型(numpy。浮动64)
c1=numpy .均值(点1,轴=0)
c2=numpy .均值(点2,轴=0)
点1 -=c1
点2 -=c2
s1=numpy.std(点s1)
s2=numpy.std(点s2)
点s1 /=s1
点s2 /=s2
u,S,Vt=numpy.linalg.svd(points1 .T *点2)
#我们寻求的稀有实际上是U * Vt给出的稀有的转置。这
#是因为上面的公式假设矩阵在右边
#(带行向量)其中我们的解决方案要求矩阵位于
#左(带列向量)。
R=(U * Vt).T
c2 .T - (s2/s1) * R * c1 .t)),
numpy.matrix([0 . 0. 1.])])
def read_im_and_landmarks(fname):
s=获取地标(即时消息)
def warp_im(im,M,dshape):
output_im=numpy.zeros(dshape,dtype=im.dtype)
cv2.warpAffine(im,
M[:2],
(dshape[1],dshape[0]),
dst=output_im,
borderMode=cv2 .边框透明,
flags=cv2 .WARP_INVERSE_MAP)
定义正确_颜色(im1、im2、地标1):
模糊_数量=颜色_正确_模糊_ FRAC *数量。利纳格。lmd由(
numpy。均值(界标S1[左眼点],轴=0) -
numpy.mean(地标1[右眼点],轴=0))
模糊数量=int(模糊数量)
如果模糊数量% 2==0:
模糊数量=1
#避免被零除的错误。
m=transformation _ from _ POINTS(landmark s 1[ALIGN _ POINTS]),
地标2[对齐点])
mask=get_face_mask(im2,landmarks2)
扭曲_遮罩=扭曲_im(遮罩,M,im1.shape)
combined _ mask=numpy。max([get _ face _ mask(im1,landmarks1),warped_mask),
轴=0)
warped_im2=warp_im(im2,M,im1.shape)
warped _ corrected _ im2=correct _ colors(im1,warped_im2,landmarks1)
output_im=im1 * (1.0 -组合_掩码)扭曲_校正_im2 *组合_掩码
cv2.imwrite(output.jpg ,output_im)
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。