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

做餐饮培训网站广告佛山网站建设外贸

做餐饮培训网站广告,佛山网站建设外贸,有什么比较好的做海报网站,微信客户端登录入口声明#xff1a;此篇文章所用的明星照片只为用于演示代码的效果#xff0c;无诋毁她人肖像之意 一、案例实现的思想 此案例的核心是基于人脸68个关键点检测模型来实现的#xff0c;人脸68个关键带点检测后的效果如下#xff1a; 通过对上图中红色区域的转换#xff0c;…声明此篇文章所用的明星照片只为用于演示代码的效果无诋毁她人肖像之意 一、案例实现的思想 此案例的核心是基于人脸68个关键点检测模型来实现的人脸68个关键带点检测后的效果如下 通过对上图中红色区域的转换来实现换脸的操作 参照以下链接文章可以帮助对此片案例内容的理解 基于 dlib 库的人脸68个关键点定位 https://blog.csdn.net/weixin_73504499/article/details/142990867?spm1001.2014.3001.5501 基于 dlib 库的人脸关键部位的轮廓轮廓检测 https://blog.csdn.net/weixin_73504499/article/details/143027371?spm1001.2014.3001.5501 实现步骤与结果如下图 二、编辑代码 步骤解析 第一步对人脸的关键部位在68个关键点中的点集确定下来并将红框内的各部位的点击存储在一个列表中 根据人脸68个关键点检测模型将脸部各部位对应的点集以列表形式存储 JAW_POINTS list(range(0, 17)) RIGHT_BROW_POINTS list(range(17, 22)) LEFT_BROW_POINTS list(range(22, 27)) NOSE_POINTS list(range(27, 35)) RIGHT_EYE_POINTS list(range(36, 42)) LEFT_EYE_POINTS list(range(42, 48)) MOUTH_POINTS list(range(48, 61)) FACE_POINTS list(range(17, 68))# 换脸的关键点集 POINTS [LEFT_BROW_POINTS RIGHT_EYE_POINTS LEFT_EYE_POINTS RIGHT_BROW_POINTS NOSE_POINTS MOUTH_POINTS]# 处理为元组后续使用方便 POINTStuple tuple(POINTS)第二步读取两张人脸图片并获取两张人脸图片的68个关键点 def getKeyPoints(im): # 获取关键点rects detector(im, 1) # 获取人脸方框位置shape predictor(im, rects[0]) # 获取关键点s np.matrix([[p.x, p.y] for p in shape.parts()]) # 将关键点转换为坐标(x,y)的形式return sa cv2.imread(dlrb_3.jpg) # 换脸A图片 b cv2.imread(zly.jpg) # 换脸B图片detector dlib.get_frontal_face_detector() # 构造脸部位置检测器 predictor dlib.shape_predictor(shape_predictor_68_face_landmarks.dat) # 获取人脸关键点定位模型aKeyPoints getKeyPoints(a) # 获取A图片的68关键点 bKeyPoints getKeyPoints(b) # 获取B图片的68关键点第三步分别获取两张人脸红色区域上图中红色的掩膜 def getFaceMask(im, keyPoints): # 根据关键点获取脸部掩膜im np.zeros(im.shape[:2], dtypenp.float64)for p in POINTS:points cv2.convexHull(keyPoints[p]) # 获取凸包cv2.fillConvexPoly(im, points, color1) # 填充凸包数字在0~1之间# 单通道im构成3通道im(3行列)改变形状(行、列、3)适应0penCVim np.array([im, im, im]).transpose((1, 2, 0))im cv2.GaussianBlur(im, (25, 25), 0) # 需要根据具体调整return imaMask getFaceMask(a, aKeyPoints) # 获取图片A的人脸掩膜 cv2.imshow(aMask, aMask) cv2.waitKey()bMask getFaceMask(b, bKeyPoints) # 获取图片B的人脸掩膜 cv2.imshow(bMask, bMask) cv2.waitKey()效果如下 第四步求出b脸仿射变换到a脸的变换矩阵M 图像的几何变换主要包括平移、旋转、缩放、剪切、仿射、透视等。 图像的几何变换主要分为刚性变换、相似变换、仿射变换和透视变换投影变换 刚性变换平移旋转 相似变换缩放剪切 仿射变换从一个二维坐标系变换到另一个二维坐标系属于线性变换。通过已知3对坐标点可以求得变换矩阵 透视变换从一个二维坐标系变换到一个三维坐标系属于非线性变换。通过已知4对坐标点可以求得变换矩阵。 下图中内容是对仿射变换的简单概述 求出b脸仿射变换到a脸的变换矩阵M,此处用到的算法难以理解大家可直接跳过 def getM(points1, points2):points1 points1.astype(np.float64) # int8转换为浮点数类型points2 points2.astype(np.float64) # 转换为浮点数类型c1 np.mean(points1, axis0) # 归一化:(数值-均值)/标准差c2 np.mean(points2, axis0) # 归一化:(数值-均值)/标准差均值不同主要是脸五官位置大小不同points1 - c1 # 减去均值points2 - c2 # 减去均值s1 np.std(points1) # 方差计算标准差s2 np.std(points2) # 方差计算标准差points1 / s1 # 除标准差,计算出归一化的结果points2 / s2 # 除标准差,计算出归一化的结果# 奇异值分解Singular Value DecompositionU, S, Vt np.linalg.svd(points1.T * points2)R (U * Vt).T # 通过U和Vt找到Rreturn np.hstack(((s2 / s1) * R, c2.T - (s2 / s1) * R * c1.T))M getM(aKeyPoints[POINTStuple], bKeyPoints[POINTStuple])第五步将b的脸部(bmask)根据M仿射变换到a上 dsize a.shape[:2][::-1] # 目标输出与图像a大小一致 # 需要注意shape是(行、列),warpAffine参数dsize是(列、行) # 使用a.shape[:2][::-1]获取a的(列、行)# 函数warpAffine(src,M,dsize,dstNone, flagsNone, borderModeNone, borderValueNone) # src:输入图像 # M:运算矩阵2行3列的 # dsize:运算后矩阵的大小也就是输出图片的尺寸 # dst:输出图像 # flags:插值方法的组合与resize函数中的插值一样可以查看cv2.resize # borderMode:边界模式BORDER_TRANSPARENT表示边界透明 # borderValue:在恒定边框的情况下使用的borderValue值;默认情况下它是 0 bMaskWarp cv2.warpAffine(bMask, M, dsize, borderModecv2.BORDER_TRANSPARENT, flagscv2.WARP_INVERSE_MAP) cv2.imshow(bMaskWarp, bMaskWarp) cv2.waitKey()结果如下 第六步获取脸部最大值(两个脸模板相加) mask np.max([aMask, bMaskWarp], axis0) cv2.imshow(mask, mask) cv2.waitKey()结果如下 第七步使用仿射矩阵M将b映射到a bWrap cv2.warpAffine(b, M, dsize, borderModecv2.BORDER_TRANSPARENT, flagscv2.WARP_INVERSE_MAP) cv2.imshow(bWrap, bWrap) cv2.waitKey()结果如下 第八步求b图片的仿射到图片a的颜色值b的颜色值改为a的颜色 def normalColor(a, b):ksize (111, 111) # 非常大的核去噪等运算时为11就比较大了aGauss cv2.GaussianBlur(a, ksize, 0) # 对a进行高斯滤波bGauss cv2.GaussianBlur(b, ksize, 0) # 对b进行高斯滤波weight aGauss / bGauss # 计算目标图像调整颜色的权重值,存在除0警告可忽略。where_are_inf np.isinf(weight)weight[where_are_inf] 0return b * weightbcolor normalColor(a, bWrap) cv2.imshow(bcolor, bcolor) cv2.waitKey()结果如下 第九步换脸(mask区域用bcolor非mask区城用a) # 换脸 out a * (1.0 - mask) bcolor * mask# 输出原始人脸、换脸结果 cv2.imshow(a, a) cv2.imshow(b, bOriginal) cv2.imshow(out, out / 255) cv2.waitKey() cv2.destroyAllWindows()最终结果如下 完整代码如下 import cv2 import dlib import numpy as np 根据人脸68个关键点检测模型将脸部各部位对应的点集以列表形式存储 JAW_POINTS list(range(0, 17)) RIGHT_BROW_POINTS list(range(17, 22)) LEFT_BROW_POINTS list(range(22, 27)) NOSE_POINTS list(range(27, 35)) RIGHT_EYE_POINTS list(range(36, 42)) LEFT_EYE_POINTS list(range(42, 48)) MOUTH_POINTS list(range(48, 61)) FACE_POINTS list(range(17, 68))# 换脸的关键点集 POINTS [LEFT_BROW_POINTS RIGHT_EYE_POINTS LEFT_EYE_POINTS RIGHT_BROW_POINTS NOSE_POINTS MOUTH_POINTS]# 处理为元组后续使用方便 POINTStuple tuple(POINTS)def getFaceMask(im, keyPoints): # 根据关键点获取脸部掩膜im np.zeros(im.shape[:2], dtypenp.float64)for p in POINTS:points cv2.convexHull(keyPoints[p]) # 获取凸包cv2.fillConvexPoly(im, points, color1) # 填充凸包数字在0~1之间# 单通道im构成3通道im(3行列)改变形状(行、列、3)适应0penCVim np.array([im, im, im]).transpose((1, 2, 0))im cv2.GaussianBlur(im, (25, 25), 0) # 需要根据具体调整return im 求出b脸仿射变换到a脸的变换矩阵M,此处用到的算法难以理解大家可直接跳过 def getM(points1, points2):points1 points1.astype(np.float64) # int8转换为浮点数类型points2 points2.astype(np.float64) # 转换为浮点数类型c1 np.mean(points1, axis0) # 归一化:(数值-均值)/标准差c2 np.mean(points2, axis0) # 归一化:(数值-均值)/标准差均值不同主要是脸五官位置大小不同points1 - c1 # 减去均值points2 - c2 # 减去均值s1 np.std(points1) # 方差计算标准差s2 np.std(points2) # 方差计算标准差points1 / s1 # 除标准差,计算出归一化的结果points2 / s2 # 除标准差,计算出归一化的结果# 奇异值分解Singular Value DecompositionU, S, Vt np.linalg.svd(points1.T * points2)R (U * Vt).T # 通过U和Vt找到Rreturn np.hstack(((s2 / s1) * R, c2.T - (s2 / s1) * R * c1.T))def getKeyPoints(im): # 获取关键点rects detector(im, 1) # 获取人脸方框位置shape predictor(im, rects[0]) # 获取关键点s np.matrix([[p.x, p.y] for p in shape.parts()]) # 将关键点转换为坐标(x,y)的形式return s 修改b图的颜色值与a图相同 def normalColor(a, b):ksize (111, 111) # 非常大的核去噪等运算时为11就比较大了aGauss cv2.GaussianBlur(a, ksize, 0) # 对a进行高斯滤波bGauss cv2.GaussianBlur(b, ksize, 0) # 对b进行高斯滤波weight aGauss / bGauss # 计算目标图像调整颜色的权重值,存在除0警告可忽略。where_are_inf np.isinf(weight)weight[where_are_inf] 0return b * weight 读取两张人脸图片并获取两张人脸图片的68个关键点 a cv2.imread(dlrb_3.jpg) # 换脸A图片 b cv2.imread(zly.jpg) # 换脸B图片detector dlib.get_frontal_face_detector() # 构造脸部位置检测器 predictor dlib.shape_predictor(shape_predictor_68_face_landmarks.dat) # 获取人脸关键点定位模型aKeyPoints getKeyPoints(a) # 获取A图片的68关键点 bKeyPoints getKeyPoints(b) # 获取B图片的68关键点bOriginal b.copy() # 不对原来的图片b进行破坏和修改 分别获取两张人脸的掩膜 aMask getFaceMask(a, aKeyPoints) # 获取图片A的人脸掩膜 cv2.imshow(aMask, aMask) cv2.waitKey()bMask getFaceMask(b, bKeyPoints) # 获取图片B的人脸掩膜 cv2.imshow(bMask, bMask) cv2.waitKey()求出b脸仿射变换到a脸的变换矩阵M M getM(aKeyPoints[POINTStuple], bKeyPoints[POINTStuple])将b的脸部(bmask)根据M仿射变换到a上 dsize a.shape[:2][::-1] # 目标输出与图像a大小一致 # 需要注意shape是(行、列),warpAffine参数dsize是(列、行) # 使用a.shape[:2][::-1]获取a的(列、行)# 函数warpAffine(src,M,dsize,dstNone, flagsNone, borderModeNone, borderValueNone) # src:输入图像 # M:运算矩阵2行3列的 # dsize:运算后矩阵的大小也就是输出图片的尺寸 # dst:输出图像 # flags:插值方法的组合与resize函数中的插值一样可以查看cv2.resize # borderMode:边界模式BORDER_TRANSPARENT表示边界透明 # borderValue:在恒定边框的情况下使用的borderValue值;默认情况下它是 0 bMaskWarp cv2.warpAffine(bMask, M, dsize, borderModecv2.BORDER_TRANSPARENT, flagscv2.WARP_INVERSE_MAP) cv2.imshow(bMaskWarp, bMaskWarp) cv2.waitKey()获取脸部最大值(两个脸模板相加) mask np.max([aMask, bMaskWarp], axis0) cv2.imshow(mask, mask) cv2.waitKey() 使用仿射矩阵M将b映射到a bWrap cv2.warpAffine(b, M, dsize, borderModecv2.BORDER_TRANSPARENT, flagscv2.WARP_INVERSE_MAP) cv2.imshow(bWrap, bWrap) cv2.waitKey() 求b图片的仿射到图片a的颜色值b的颜色值改为a的颜色 bcolor normalColor(a, bWrap) cv2.imshow(bcolor, bcolor) cv2.waitKey() 换脸(mask区域用bcolor非mask区城用a) out a * (1.0 - mask) bcolor * mask# 输出原始人脸、换脸结果 cv2.imshow(a, a) cv2.imshow(b, bOriginal) cv2.imshow(out, out / 255) cv2.waitKey() cv2.destroyAllWindows()
http://www.hkea.cn/news/14275215/

相关文章:

  • 哪个网站专门做二手的制作企业网页
  • 中国正能量不良网站直接进入海尔建设此网站的目的是什么意思
  • wordpress 中文站遵义招标网
  • 做招商的网络营销推广莆田网站建设优化
  • 如何给网站添加音乐东营今天的消息
  • 拿网站的文章做外链公司基本介绍模版
  • 合作网站登录制作本地环境wordpress修改php.ini
  • html5网站开发实例书籍做贸易的网站有哪些
  • 视频网站开发代码泰安建站哪家好
  • 重庆专业网站推广公司有哪些网站程序
  • 用笔记本做网站中国志愿者服务网站登录注册
  • 贵州有网站的企业wordpress4.7不支持tag
  • 建设网站需要什么少儿编程app
  • 微信网站建设协议网站怎么做伪静态页面
  • 教育类网站前置审批系统 用户登录网站建设特效大全
  • 票据理财网站建设连云港网站关键字优化市场
  • 个人域名做邮箱网站上海有哪些优化网站推广公司
  • 淘宝客网站建站源码做药的常用网站有哪些
  • 昆明网站建设公司排名html网页制作基础教程
  • 黄石网站设计制作搞定设计官网
  • 华强北做电子网站建设广西智能网站建设设计
  • 域名过期做的网站怎么办好多网站没排名了
  • 网页设计与网站建设教程电商美工招聘信息
  • 六 网站建设方案.影视网站源码下载
  • php网站开发 多少钱手机建网站 优帮云
  • 中国站长站官网微信商城小程序开发一般需要多少钱
  • 外贸企业建网站哪个网站可以做面料订单
  • 长沙做网站微联讯点很好网页页面下载
  • 商洛网站建设湖南软件开发
  • 自己做的网站点首页出错百姓畅言六安杂谈