基于dlib68点人脸检测的小功能实现

图像旋转找的现成的方法,稍稍麻烦点的地方就是mask处理,虽然目的达到了,但是效果一般

  1. import numpy as np
  2. import cv2 as cv
  3. import dlib
  4. import math
  5.  
  6. # 做一个戴眼镜的滤镜效果
  7.  
  8. detector = dlib.get_frontal_face_detector()
  9. predictor = dlib.shape_predictor('dlib/shape_predictor_68_face_landmarks.dat')
  10.  
  11. # 图像旋转,保持原来大小
  12. def rotate_bound(image, angle):
  13. # grab the dimensions of the image and then determine the
  14. # center
  15. (h, w) = image.shape[:2]
  16. (cX, cY) = (w // 2, h // 2)
  17.  
  18. # grab the rotation matrix (applying the negative of the
  19. # angle to rotate clockwise), then grab the sine and cosine
  20. # (i.e., the rotation components of the matrix)
  21. M = cv.getRotationMatrix2D((cX, cY), -angle, 1.0)
  22. cos = np.abs(M[0, 0])
  23. sin = np.abs(M[0, 1])
  24.  
  25. # compute the new bounding dimensions of the image
  26. nW = int((h * sin) + (w * cos))
  27. nH = int((h * cos) + (w * sin))
  28.  
  29. # adjust the rotation matrix to take into account translation
  30. M[0, 2] += (nW / 2) - cX
  31. M[1, 2] += (nH / 2) - cY
  32.  
  33. # perform the actual rotation and return the image
  34. return cv.warpAffine(image, M, (nW, nH))
  35.  
  36. def detect_face(camera_idx):
  37. # camera_idx: 电脑自带摄像头或者usb摄像头
  38. cv.namedWindow('detect')
  39. cap = cv.VideoCapture(camera_idx)
  40.  
  41. while cap.isOpened():
  42. cv.namedWindow('detect', cv.WINDOW_AUTOSIZE)
  43. ok, frame = cap.read()
  44. # 为摄像头的时候,翻转画面
  45. if camera_idx == 0 or camera_idx == 1:
  46. frame = cv.flip(frame, 1, dst=None)
  47. if not ok:
  48. break
  49. gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
  50. rects = detector(gray, 0)
  51. for i in range(len(rects)):
  52. landmarks = np.matrix([[p.x, p.y] for p in predictor(frame, rects[i]).parts()])
  53. # 脸轮廓:1~17
  54. # 眉毛:18~22, 23~27
  55. # 鼻梁:28~31
  56. # 鼻子:31~36
  57. # 眼睛:37~42, 43~48
  58. # 嘴唇:49~68
  59. # 左眼角和右眼角的位置
  60. pos_left = (landmarks[0][0, 0], landmarks[36][0, 1])
  61. pos_right = (landmarks[16][0, 0], landmarks[45][0, 1])
  62. face_center = (landmarks[27][0, 0], landmarks[27][0, 1])
  63. src = cv.imread('images/glasses.jpg')
  64. # 433x187眼镜图片原始大小,按人脸比例缩放一下
  65. length = pos_right[0] - pos_left[0]
  66. width = int(187/(433/length))
  67. src = cv.resize(src, (length, width), interpolation=cv.INTER_CUBIC)
  68.  
  69. # 角度旋转,通过计算两个眼角和水平方向的夹角来旋转眼镜
  70. sx = landmarks[36][0, 0] - landmarks[45][0, 0]
  71. sy = landmarks[36][0, 1] - landmarks[45][0, 1]
  72. # 夹角正切值
  73. r = sy/sx
  74. # 求正切角,弧度转为度
  75. degree = math.degrees(math.atan(r))
  76. # 调用旋转方法
  77. src = rotate_bound(src, degree)
  78.  
  79. # mask处理,去掉旋转后的无关区域,初始化一个全0mask,用或运算处理mask
  80. src_mask = np.zeros(src.shape, src.dtype)
  81. src_mask = cv.bitwise_or(src, src_mask)
  82. # 泊松融合
  83. output = cv.seamlessClone(src, frame, src_mask, face_center, cv.MIXED_CLONE)
  84. cv.imshow('detect', output)
  85. c = cv.waitKey(10)
  86. if c & 0xFF == ord('q'):
  87. break
  88. cap.release()
  89. cv.destroyAllWindows()
  90.  
  91. if __name__ == '__main__':
  92. video = 'video/face.mp4'
  93. detect_face(video)

眼镜图片

效果

泊松融合三种参数效果在这里一样

除了眼镜图片较浅其他的还算可以吧

还可以扩展面部其他装饰

参考:

泊松融合:https://www.smwenku.com/a/5b7aec012b7177392c97200d

图像旋转:https://blog.csdn.net/hui3909/article/details/78854387

opencv图像融合(给人脸添加一个眼镜)的更多相关文章

  1. opencv图像融合(大头)

    单纯的变大再覆盖上去,头部检测信息不够全,效果实在是太差,就不多说了,只是按照自己的思路玩一玩,没有达到抖音上那么好的效果 import cv2 as cv import numpy as np im ...

  2. OpenCV计算机视觉学习(2)——图像算术运算 & 掩膜mask操作(数值计算,图像融合,边界填充)

    在OpenCV中我们经常会遇到一个名字:Mask(掩膜).很多函数都使用到它,那么这个Mask到底是什么呢,下面我们从图像基本运算开始,一步一步学习掩膜. 1,图像算术运算 图像的算术运算有很多种,比 ...

  3. OpenCV探索之路(二十四)图像拼接和图像融合技术

    图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要. 再举一个身边的例子吧,你用你的手 ...

  4. 系统---添加一个相机的IP实现opencv读取rstp视频流

    系统---添加一个相机的IP实现opencv读取视频流 这里: 第一步,添加一个6段的相机IP地址:先ping 一个IP地址,ping通的是再用的IP,不可添加:ping不通的,添加IP到网络. 第二 ...

  5. OpenCV中图像融合

         准备2副背景图像,注意图像黑色的部分,是作为mask用的,我们会用灰度图的方式打开它们,这时黑色的部分值为0,则图像融合时候,可以把第二幅图像在黑色的部分显示出来. 代码非常简单,注意就是图 ...

  6. 使用OpenCV和Python进行人脸识别

    介绍 人脸识别是什么?或识别是什么?当你看到一个苹果时,你的大脑会立刻告诉你这是一个苹果.在这个过程中,你的大脑告诉你这是一个苹果水果,用简单的语言来说就是识别.那么什么是人脸识别呢?我肯定你猜对了. ...

  7. OpenCV学习 物体检测 人脸识别 填充颜色

    介绍 OpenCV是开源计算机视觉和机器学习库.包含成千上万优化过的算法.项目地址:http://opencv.org/about.html.官方文档:http://docs.opencv.org/m ...

  8. 【从零学习openCV】IOS7根据人脸检测

    前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app.总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...

  9. OpenCV Facial Landmark Detection 人脸关键点检测

    Opencv-Facial-Landmark-Detection 利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Note: OpenCV3.4 ...

随机推荐

  1. Full Regularization Path for Sparse Principal Component Analysis

    目录 背景 Notation Sparse PCA Semidefinite Relaxation Low Rank Optimization Sorting and Thresholding 背景 ...

  2. Spectral Bounds for Sparse PCA: Exact and Greedy Algorithms[贪婪算法选特征]

    目录 概括 Sparse PCA Formulation 非常普遍的问题 Optimality Conditions Eigenvalue Bounds 算法 代码 概括 这篇论文,不像以往的那些论文 ...

  3. plw的骰子

    链接 [http://murphyc.fun/problem/4007] 题意 描述 duxing2016有一个神奇的骰子,投出1-6的概率为(p1,p2...p6) 现在他投n次骰子,问投出点数和大 ...

  4. ElasticSearch 分组查询的几个例子

    facets接口可以根据query返回统计数据,其中的 terms_stats 是分组统计,根据key的情况返回value的统计数据,类似group by的意思. "terms_stats& ...

  5. Laravel 门面实例教程 —— 创建自定义 Facades 类

    我们首先创建一个需要绑定到服务容器的Test类: <?php namespace App\Facades; class Test { public function doSomething() ...

  6. [转帖]Linux 下如何知道是否有人在使坏?

    Linux 下如何知道是否有人在使坏? 学到了两个最简单的命令 usermod -L username 锁定账户 passwd -s username 查看用户状态. 自己linux 知道的还是少 需 ...

  7. python 钉钉机器人发送消息

    import json import requests def sendmessage(message): url = 'https://oapi.dingtalk.com/robot/send?ac ...

  8. 自定义Attribute类

    在我们的项目中有时经常会标识一些类的特性,在下面我们将简短的方式来介绍如何构建自定义的Attribute类. using System; using System.Collections.Generi ...

  9. DAY05、基本数据类型与内置方法

    一.可变类型与不可变类型: 1.可变类型:值改变,但是id不变 2.不可变类型:值改变,id也改变 二.数据类型: 1.数字类型: 1.1:整型int: 用途:记录年龄.等级.数量 定义方式:age ...

  10. python数据结构与算法第十三天【归并排序】

    1.代码实现 def merge_sort(alist): if len(alist) <= 1: return alist # 二分分解 num = len(alist)/2 left = m ...