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 ...
随机推荐
- Full Regularization Path for Sparse Principal Component Analysis
目录 背景 Notation Sparse PCA Semidefinite Relaxation Low Rank Optimization Sorting and Thresholding 背景 ...
- Spectral Bounds for Sparse PCA: Exact and Greedy Algorithms[贪婪算法选特征]
目录 概括 Sparse PCA Formulation 非常普遍的问题 Optimality Conditions Eigenvalue Bounds 算法 代码 概括 这篇论文,不像以往的那些论文 ...
- plw的骰子
链接 [http://murphyc.fun/problem/4007] 题意 描述 duxing2016有一个神奇的骰子,投出1-6的概率为(p1,p2...p6) 现在他投n次骰子,问投出点数和大 ...
- ElasticSearch 分组查询的几个例子
facets接口可以根据query返回统计数据,其中的 terms_stats 是分组统计,根据key的情况返回value的统计数据,类似group by的意思. "terms_stats& ...
- Laravel 门面实例教程 —— 创建自定义 Facades 类
我们首先创建一个需要绑定到服务容器的Test类: <?php namespace App\Facades; class Test { public function doSomething() ...
- [转帖]Linux 下如何知道是否有人在使坏?
Linux 下如何知道是否有人在使坏? 学到了两个最简单的命令 usermod -L username 锁定账户 passwd -s username 查看用户状态. 自己linux 知道的还是少 需 ...
- python 钉钉机器人发送消息
import json import requests def sendmessage(message): url = 'https://oapi.dingtalk.com/robot/send?ac ...
- 自定义Attribute类
在我们的项目中有时经常会标识一些类的特性,在下面我们将简短的方式来介绍如何构建自定义的Attribute类. using System; using System.Collections.Generi ...
- DAY05、基本数据类型与内置方法
一.可变类型与不可变类型: 1.可变类型:值改变,但是id不变 2.不可变类型:值改变,id也改变 二.数据类型: 1.数字类型: 1.1:整型int: 用途:记录年龄.等级.数量 定义方式:age ...
- python数据结构与算法第十三天【归并排序】
1.代码实现 def merge_sort(alist): if len(alist) <= 1: return alist # 二分分解 num = len(alist)/2 left = m ...