当前位置: 首页 > news >正文

网站建设合同验收为啥做网站

网站建设合同验收,为啥做网站,百度网盘网页登录入口,现在什么推广效果好呢前言 前面介绍了仅替换五官的方法#xff0c;这里介绍整张脸的方法。 国际惯例#xff0c;参考博客#xff1a; [图形算法]Delaunay三角剖分算法 维诺图#xff08;Voronoi Diagram#xff09;分析与实现 Delaunay Triangulation and Voronoi Diagram using OpenCV (…前言 前面介绍了仅替换五官的方法这里介绍整张脸的方法。 国际惯例参考博客 [图形算法]Delaunay三角剖分算法 维诺图Voronoi Diagram分析与实现 Delaunay Triangulation and Voronoi Diagram using OpenCV ( C / Python ) Face Swap using OpenCV ( C / Python ) learnopencv中的换脸源码 流程 整脸替换的流程与仅替换五官的时候稍微有点区别步骤为 检测人脸关键点依据人脸关键点的凸包进行人脸三角剖分对两人人脸对应的三角网格进行变形对齐使用seamlessclone柏松融合算法进行贴图 先加载必要的库 import cv2 import numpy as np import matplotlib.pyplot as plt检测人脸关键点 跟上一篇人脸替换的博客一样代码直接贴过来了 cas cv2.CascadeClassifier(./model/haarcascade_frontalface_alt2.xml) obj cv2.face.createFacemarkLBF() obj.loadModel(./model/lbfmodel.yaml) # opencv检测关键点 def detect_facepoint(img):img_gray cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)print(img_gray.shape)print(cas.detectMultiScale(img_gray,2,3,0,(30,30)))faces cas.detectMultiScale(img_gray,2,3,0,(30,30))landmarks obj.fit(img_gray,faces)assert landmarks[0],no face detectedif(len(landmarks[1])1):print(multi face detected,use the first)return faces[0],np.squeeze(landmarks[1][0]) #绘制人脸关键点 def draw_kps(img,face_box,kps,kpssize3):img_show img.copy()cv2.rectangle(img_show,(face_box[0],face_box[1]),(face_box[0]face_box[2],face_box[1]face_box[3]),(0,255,0),3)for i in range(kps.shape[0]):cv2.circle(img_show,(kps[i,0],kps[i,1]),kpssize,(0,0,255),-1)img_show cv2.cvtColor(img_show,cv2.COLOR_BGR2RGB)return img_show三角剖分 根据人脸关键点提取人脸三角网格流程是先提取人脸区域的凸包参考这里接下来使用getTriangleList函数提取人脸网格 def get_triangle(img,facekpts):convex_kps cv2.convexHull(facekpts,returnPointsTrue)kps np.squeeze(convex_kps)rect (0,0,img.shape[1],img.shape[0])subdiv cv2.Subdiv2D(rect)for i in range(kps.shape[0]):subdiv.insert((kps[i,0],kps[i,1]))triangleList subdiv.getTriangleList()return triangleList写一个画图函数可视化三角网格 def draw_triangles(img,triangles):for t in triangles:pt1 (t[0],t[1])pt2 (t[2],t[3])pt3 (t[4],t[5])cv2.line(img,pt1,pt2,(0,255,0),2,cv2.LINE_AA)cv2.line(img,pt1,pt3,(0,255,0),2,cv2.LINE_AA)cv2.line(img,pt2,pt3,(0,255,0),2,cv2.LINE_AA)img cv2.cvtColor(img,cv2.COLOR_BGR2RGB)return img可视化看看 # 提取人脸关键点 img1 cv2.imread(./images/hjh.jpg) img2 cv2.imread(./images/zly.jpg) face_box1,face_kps1 detect_facepoint(img1) face_kps1face_kps1.astype(int) face_box2,face_kps2 detect_facepoint(img2) face_kps2face_kps2.astype(int) #获取三角网格 img_t1 get_triangle(img1,face_kps1) img_t2 get_triangle(img2,face_kps2) #可视化 plt.figure(figsize(8,8)) plt.subplot(121) plt.imshow(draw_triangles(img1.copy(),img_t1)) plt.axis(off) plt.subplot(122) plt.imshow(draw_triangles(img2.copy(),img_t2)) plt.axis(off)网格变形 目的是将第二个人脸分别用网格变形到第一个人脸对应的网格区域。 所以第二个人脸的网格没用可以按照第一个人脸的网格分割第二个人脸。这两个人脸唯一对应的地方就是他们关键点的索引顺序相同所以找到第一个网格每个顶点对应是哪个人脸关键点就能用索引重新分割第二个人脸。 找第一个人脸的每个网格对应的人脸关键点 #找到三角网格对应的关键点索引 def get_nearest(img_t,face_kps):triangle_idx[]for t in img_t:idx1np.argmin(np.sum(abs(face_kps-np.array([[t[0],t[1]]])),axis1))idx2np.argmin(np.sum(abs(face_kps-np.array([[t[2],t[3]]])),axis1))idx3np.argmin(np.sum(abs(face_kps-np.array([[t[4],t[5]]])),axis1))triangle_idx.append([idx1,idx2,idx3])return triangle_idx接下来提取第二个图像的每一块进行变形举个例子比如第二块网格。流程是提取三角网格的外接矩形把它切出来并且把举行里面对应的三个关键点的坐标重新计算一下 # 提取第一张图的所有三角网格对应的人脸关键点索引 wrap_idx get_nearest(img_t1,face_kps1) i2 # 块索引 # 三角形的三个坐标 t1 face_kps1[wrap_idx[i]] t2 face_kps2[wrap_idx[i]] # 提取三角网格的外接矩形 patch_rect1 cv2.boundingRect(t1) patch_rect2 cv2.boundingRect(t2) # 重置关键点坐标 new_t1 t1 - np.array([[ patch_rect1[0],patch_rect1[1] ]]) new_t2 t2 - np.array([[ patch_rect2[0],patch_rect2[1] ]]) # 把第二张图像对应的图像块切分开 img_patch2 img2[patch_rect2[1]:patch_rect2[1]patch_rect2[3],patch_rect2[0]:patch_rect2[0]patch_rect2[2]]可视化看看当前的图像切块和关键点是不是对应因为opencv里面经常出现坐标轴弄反的问题 #验证当前关键点是否正确 plt.figure(figsize(8,8)) plt.subplot(131) plt.imshow(cv2.cvtColor(img_patch2.copy(),cv2.COLOR_BGR2RGB)) plt.axis(off) plt.subplot(132) plt.imshow(draw_kps(img_patch2,(0,0,patch_rect2[2],patch_rect2[3]),new_t2)) plt.axis(off) plt.subplot(133) plt.imshow(draw_kps(img2.copy(),face_box2,t2,4)) plt.axis(off)接下来将第二个图像的三角网格变形使其能够贴到第一张图对应的三角区域变形函数很简单难就是利用opencv的计算变形矩阵函数getAffineTransform和应用变形函数warpAffine将两个区域变形对齐 def applyAffineTransform(src, srcTri, dstTri, size) : # 给定两个三角形找到第一个到第二个的仿射变换矩阵warpMat cv2.getAffineTransform( np.float32(srcTri), np.float32(dstTri) ) # 将第一个做仿射变换dst cv2.warpAffine( src, warpMat, (size[0], size[1]), None, flagscv2.INTER_LINEAR, borderModecv2.BORDER_REFLECT_101 )return dst调用上面的函数利用两个三角形的仿射变换矩阵将图二的块变形 patch_affine2applyAffineTransform(img_patch2,new_t2,new_t1,(patch_rect1[2],patch_rect1[3]))可视化看看呗 plt.imshow(cv2.cvtColor(patch_affine2.copy(),cv2.COLOR_BGR2RGB)) plt.axis(off)我们只需要将三角网格部分贴过去而非贴上面的这个矩形区域所以利用掩膜去贴三角区域 mask np.zeros((patch_rect1[3],patch_rect1[2],3),dtypenp.uint8) mask cv2.fillConvexPoly(mask,new_t1,(1,1,1),16,0) mask_img patch_affine2*mask img1[patch_rect1[1]:patch_rect1[1]patch_rect1[3],patch_rect1[0]:patch_rect1[0]patch_rect1[2]] \img1[patch_rect1[1]:patch_rect1[1]patch_rect1[3],patch_rect1[0]:patch_rect1[0]patch_rect1[2]]*(1-mask) img1[patch_rect1[1]:patch_rect1[1]patch_rect1[3],patch_rect1[0]:patch_rect1[0]patch_rect1[2]] \img1[patch_rect1[1]:patch_rect1[1]patch_rect1[3],patch_rect1[0]:patch_rect1[0]patch_rect1[2]]mask_img可视化看看 plt.imshow(cv2.cvtColor(img1.copy(),cv2.COLOR_BGR2RGB)) plt.axis(off)仔细看下嘴唇下面有一道印那个地方就是第2块三角网格的贴图结果。 这一块的整体函数是 def warp_triangle(dst_img,src_img,img_tri1,kps1,kps2):# 提取第一张图的所有三角网格对应的人脸关键点索引wrap_idx get_nearest(img_tri1,kps1)for i in range(len(wrap_idx)): #将第二个图的每个网格变形贴到第一张图的对应位置t1 kps1[wrap_idx[i]]t2 kps2[wrap_idx[i]]patch_rect1 cv2.boundingRect(t1)patch_rect2 cv2.boundingRect(t2)new_t1 t1 - np.array([[ patch_rect1[0],patch_rect1[1] ]])new_t2 t2 - np.array([[ patch_rect2[0],patch_rect2[1] ]])img_patch2 src_img[patch_rect2[1]:patch_rect2[1]patch_rect2[3],patch_rect2[0]:patch_rect2[0]patch_rect2[2]]# 提取第二张图的网格图像patch_affine2applyAffineTransform(img_patch2,new_t2,new_t1,(patch_rect1[2],patch_rect1[3])) #变形#将第二张图网格变形后贴到第一张图对应地方mask np.zeros((patch_rect1[3],patch_rect1[2],3),dtypenp.uint8)mask cv2.fillConvexPoly(mask,new_t1,(1,1,1),16,0)mask_img patch_affine2*maskdst_img[patch_rect1[1]:patch_rect1[1]patch_rect1[3],patch_rect1[0]:patch_rect1[0]patch_rect1[2]] \dst_img[patch_rect1[1]:patch_rect1[1]patch_rect1[3],patch_rect1[0]:patch_rect1[0]patch_rect1[2]]*(1-mask)dst_img[patch_rect1[1]:patch_rect1[1]patch_rect1[3],patch_rect1[0]:patch_rect1[0]patch_rect1[2]] \dst_img[patch_rect1[1]:patch_rect1[1]patch_rect1[3],patch_rect1[0]:patch_rect1[0]patch_rect1[2]]mask_imgreturn dst_img所有的网格都变形以后的结果图 # 对人脸网格进行变形 wrap_img warp_triangle(img1.copy(),img2.copy(),img_t1,face_kps1,face_kps2)可视化结果 plt.imshow(cv2.cvtColor(wrap_img,cv2.COLOR_BGR2RGB)) plt.axis(off)很明显遇到了颜色不一致问题导致贴图痕迹明显。 颜色校正 上一章节我们引用的是一种高斯校正的方法这里我们直接用opencv的seamlessClone()方法使用泊松融合的方法矫正贴图痕迹过于明显的问题。 流程就是重新提取一次面部掩膜利用此掩膜调用opencv函数贴图 # 对人脸进行重新贴图 convex1 cv2.convexHull(face_kps1,returnPointsTrue) mask np.zeros_like(img1) mask cv2.fillConvexPoly(mask,convex1,(255,255,255)) rcv2.boundingRect(convex1) center ((r[0]int(r[2]/2)),r[1]int(r[3]/2)) result_img cv2.seamlessClone(wrap_img,img1,mask,center,cv2.NORMAL_CLONE)可视化结果 plt.figure(figsize(18,18)) plt.subplot(131) plt.imshow(mask.astype(np.uint8)) plt.axis(off) plt.subplot(132) plt.imshow(cv2.cvtColor(wrap_img,cv2.COLOR_BGR2RGB)) plt.axis(off) plt.subplot(133) plt.imshow(cv2.cvtColor(result_img,cv2.COLOR_BGR2RGB)) plt.axis(off)这个脸的方向看起来很怪所以我们尽量让换脸的两个人的图面部朝向保持一致。用女神俞飞鸿和赵丽颖的图像做替换效果如下 好吧反正我是看不出来左下角图片是赵丽颖。不要慌算法多多后面再想其他算法。 后记 本文是上一片只替换五官换脸方法的更进一步的替换方法替换整张面部。 博客代码 链接: https://pan.baidu.com/s/11syxp6yM96GVGi09FSGUwQ 提取码: e8ae 本文已经同步到微信公众号中公众号与本博客将持续同步更新运动捕捉、机器学习、深度学习、计算机视觉算法敬请关注
http://www.zqtcl.cn/news/237271/

相关文章:

  • 咨询公司网站设计网站建设技能
  • 上海湖南网站建设新学校网站建设成果
  • 网站开发有哪些竞赛建站行业新闻
  • 满足seo需求的网站大型网站常见问题
  • 做网站要求高吗珠宝网站建设
  • 网站建设方案 预算高端制作网站哪家专业
  • 响应式网站什么意思长春做个人网站做不了
  • 手机网站排名优化软件网站登陆页面怎么做
  • 辽宁网站建设价格杭江建设有限公司
  • 成立公司在什么网站网络推广推广培训
  • 承德网站制作公司哪家好公司网络组建方案模板
  • 用wordpress 建网站网站关键词怎么改
  • 怎么做网站做站点创建站怎么上传网站怎么办
  • 十堰网站建设专家html做的旅游网站
  • 网站项目上线流程网站改版需求说明
  • 网站建设制作公司xshell如何做网站
  • 义乌个人兼职做建设网站琼海做网站公司
  • 什么网站可以直接做word在柬埔寨做网站彩票推广
  • 深圳市宝安区住房和建设局网站校园网络方案设计
  • 株洲建设网站制作seo快速软件
  • 建站什么程序好wordpress返佣
  • 网站建设使用虚拟主机的优点与缺点马蹄室内设计论坛
  • 像wordpress一样的网站wordpress提示数据库出错
  • 优化网站首页新项目首码对接平台
  • 一个完整的网站建设过程wordpress企业中文模板下载
  • 我做微信淘宝客网站有哪些在公司做网站是什么职位
  • 湖南网站建设公司 干净磐石网络网站开发技术可行性分析怎么写
  • 石家庄制作网站网络推广与优化
  • 建站平台免代码可以自己设计图案的软件
  • 中山网站开发公司事业单位 网站备案