opencv图像融合(给人脸添加一个眼镜)
基于dlib68点人脸检测的小功能实现
图像旋转找的现成的方法,稍稍麻烦点的地方就是mask处理,虽然目的达到了,但是效果一般
import numpy as np
import cv2 as cv
import dlib
import math # 做一个戴眼镜的滤镜效果 detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('dlib/shape_predictor_68_face_landmarks.dat') # 图像旋转,保持原来大小
def rotate_bound(image, angle):
# grab the dimensions of the image and then determine the
# center
(h, w) = image.shape[:2]
(cX, cY) = (w // 2, h // 2) # grab the rotation matrix (applying the negative of the
# angle to rotate clockwise), then grab the sine and cosine
# (i.e., the rotation components of the matrix)
M = cv.getRotationMatrix2D((cX, cY), -angle, 1.0)
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1]) # compute the new bounding dimensions of the image
nW = int((h * sin) + (w * cos))
nH = int((h * cos) + (w * sin)) # adjust the rotation matrix to take into account translation
M[0, 2] += (nW / 2) - cX
M[1, 2] += (nH / 2) - cY # perform the actual rotation and return the image
return cv.warpAffine(image, M, (nW, nH)) def detect_face(camera_idx):
# camera_idx: 电脑自带摄像头或者usb摄像头
cv.namedWindow('detect')
cap = cv.VideoCapture(camera_idx) while cap.isOpened():
cv.namedWindow('detect', cv.WINDOW_AUTOSIZE)
ok, frame = cap.read()
# 为摄像头的时候,翻转画面
if camera_idx == 0 or camera_idx == 1:
frame = cv.flip(frame, 1, dst=None)
if not ok:
break
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
rects = detector(gray, 0)
for i in range(len(rects)):
landmarks = np.matrix([[p.x, p.y] for p in predictor(frame, rects[i]).parts()])
# 脸轮廓:1~17
# 眉毛:18~22, 23~27
# 鼻梁:28~31
# 鼻子:31~36
# 眼睛:37~42, 43~48
# 嘴唇:49~68
# 左眼角和右眼角的位置
pos_left = (landmarks[0][0, 0], landmarks[36][0, 1])
pos_right = (landmarks[16][0, 0], landmarks[45][0, 1])
face_center = (landmarks[27][0, 0], landmarks[27][0, 1])
src = cv.imread('images/glasses.jpg')
# 433x187眼镜图片原始大小,按人脸比例缩放一下
length = pos_right[0] - pos_left[0]
width = int(187/(433/length))
src = cv.resize(src, (length, width), interpolation=cv.INTER_CUBIC) # 角度旋转,通过计算两个眼角和水平方向的夹角来旋转眼镜
sx = landmarks[36][0, 0] - landmarks[45][0, 0]
sy = landmarks[36][0, 1] - landmarks[45][0, 1]
# 夹角正切值
r = sy/sx
# 求正切角,弧度转为度
degree = math.degrees(math.atan(r))
# 调用旋转方法
src = rotate_bound(src, degree) # mask处理,去掉旋转后的无关区域,初始化一个全0mask,用或运算处理mask
src_mask = np.zeros(src.shape, src.dtype)
src_mask = cv.bitwise_or(src, src_mask)
# 泊松融合
output = cv.seamlessClone(src, frame, src_mask, face_center, cv.MIXED_CLONE)
cv.imshow('detect', output)
c = cv.waitKey(10)
if c & 0xFF == ord('q'):
break
cap.release()
cv.destroyAllWindows() if __name__ == '__main__':
video = 'video/face.mp4'
detect_face(video)
眼镜图片

效果

泊松融合三种参数效果在这里一样
除了眼镜图片较浅其他的还算可以吧
还可以扩展面部其他装饰
参考:
泊松融合:https://www.smwenku.com/a/5b7aec012b7177392c97200d
图像旋转:https://blog.csdn.net/hui3909/article/details/78854387
opencv图像融合(给人脸添加一个眼镜)的更多相关文章
- opencv图像融合(大头)
单纯的变大再覆盖上去,头部检测信息不够全,效果实在是太差,就不多说了,只是按照自己的思路玩一玩,没有达到抖音上那么好的效果 import cv2 as cv import numpy as np im ...
- OpenCV计算机视觉学习(2)——图像算术运算 & 掩膜mask操作(数值计算,图像融合,边界填充)
在OpenCV中我们经常会遇到一个名字:Mask(掩膜).很多函数都使用到它,那么这个Mask到底是什么呢,下面我们从图像基本运算开始,一步一步学习掩膜. 1,图像算术运算 图像的算术运算有很多种,比 ...
- OpenCV探索之路(二十四)图像拼接和图像融合技术
图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要. 再举一个身边的例子吧,你用你的手 ...
- 系统---添加一个相机的IP实现opencv读取rstp视频流
系统---添加一个相机的IP实现opencv读取视频流 这里: 第一步,添加一个6段的相机IP地址:先ping 一个IP地址,ping通的是再用的IP,不可添加:ping不通的,添加IP到网络. 第二 ...
- OpenCV中图像融合
准备2副背景图像,注意图像黑色的部分,是作为mask用的,我们会用灰度图的方式打开它们,这时黑色的部分值为0,则图像融合时候,可以把第二幅图像在黑色的部分显示出来. 代码非常简单,注意就是图 ...
- 使用OpenCV和Python进行人脸识别
介绍 人脸识别是什么?或识别是什么?当你看到一个苹果时,你的大脑会立刻告诉你这是一个苹果.在这个过程中,你的大脑告诉你这是一个苹果水果,用简单的语言来说就是识别.那么什么是人脸识别呢?我肯定你猜对了. ...
- OpenCV学习 物体检测 人脸识别 填充颜色
介绍 OpenCV是开源计算机视觉和机器学习库.包含成千上万优化过的算法.项目地址:http://opencv.org/about.html.官方文档:http://docs.opencv.org/m ...
- 【从零学习openCV】IOS7根据人脸检测
前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app.总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...
- OpenCV Facial Landmark Detection 人脸关键点检测
Opencv-Facial-Landmark-Detection 利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Note: OpenCV3.4 ...
随机推荐
- struts2之配置文件struts.xml详解
struts配置文件 struts.xml配置参数详解 struts.xml中很大一部分配置默认配置就好了 但是有些还是需要做了解 以便于理解 和修改 <?xml version=" ...
- D2. Great Vova Wall (Version 2)
l链接 [https://codeforces.com/contest/1092/problem/D2] 题意 和D1一样只是不能竖直放了 分析 水平放的话,就只可能是相邻等时才可以,而且你会发现 只 ...
- ssm知识点总结
项目名称:教育网—在线调查系统 项目总体流程图: 设计调查:调查-->包裹--->问题(增删改查) 1.调整包裹顺序 2.移动复制包裹 3.深度删除 创建调查流程分析: 主要生成surve ...
- MongoDB Redis
MongoDB Redis设置用户名密码了吗?看看shodan这款邪恶的搜索引擎吧!~ 早上看新闻的时候看到了个醒目的新闻 开源中国:MongoDB 赎金事件持续发酵,究竟是谁之过?博客园:Mon ...
- Python_匿名函数
匿名函数:为了解决那些功能很简单的需求而设计的一句话函数. 代码如下: 1 正常函数: 2 3 def calc(n): 4 5 return n ** n 6 7 print(calc(10)) 8 ...
- awk+sed编程
- java不同的包下相同的类名的问题与解决办法
Java中的类以包进行分类组织,当程序中需要用到某个包下的类时,可以以该类的全限定名进行引用.这样,不同的包中的类就可以同名,不会产生混淆. 但是这样就可能导致引用的时候会产生一些问题. 第一个问题, ...
- spark单击 搭建
http://files.cnblogs.com/files/yxnyd/spark.zip
- mysql 清除大数据表单
背景:mysql数据库中有个日志表记录高达800多万,影响了mysql的正常业务访问,现需要清理三个月之前的所有数据,大概600多万(大概13G) 方法一:传统delete from xxx,传统,普 ...
- Python OpenCV人脸识别案例
■环境 Python 3.6.0 Pycharm 2017.1.3 ■库.库的版本 OpenCV 3.4.1 (cp36) ■haarcascades下载 https://github.com/ope ...