opencv - 像换脸一样的 JibJab
问题描述
我正在尝试一个带有面部检测和替换的样本,但我想做一些平滑的事情,就像 jibjab.com 所做的那样。
当我想到这一点时,视频应该已经过预处理,并且必须标记面部坐标。
我尝试使用 OpenCv 使用给定图像自动替换检测到的人脸示例。
while(cap.isOpened()):
ret, frame = cap.read()
if frame is None:
break
result_image = frame.copy()
faces = faceCascade.detectMultiScale(frame, 1.1, 2, 0|cv2.CASCADE_SCALE_IMAGE, (30, 30))
if len(faces) != 0:
for f in faces:
x, y, w, h = [ v for v in f ]
#resize image to the face size in the video
img = cv2.resize(replace_face, (w, h))
cv2.rectangle(frame, (x,y), (x+w,y+h), (255,255,0), 5)
sub_face = frame[y:y+h, x:x+w]
result_image[y:y+sub_face.shape[0], x:x+sub_face.shape[1]] = img
但是图像替换并不像在 JibJab 中那样平滑,显然它是逐帧替换的。
我该怎么做呢?如果我需要手动处理每个视频以捕获面部坐标,然后用图像替换我应该使用哪些技术或工具?
解决方案
我不会像您使用它那样使用基于 haar 的面部检测器。你可以做的是使用dlib 的人脸界标检测器来检测眼睛和嘴巴,然后找到将给定人脸转换为视频中人脸的单应性。可能您还需要应用平滑过滤器,例如alpha beta 过滤器,这样脸部就不会显得紧张。
推荐阅读
- python - 检查 Python 数据框中的列表是否包含特定值,同时忽略 NaN
- python - 当我在 Rust 中使用 pyo3 构建 python 库时出现错误“根目录中没有 py”
- c# - xamarin 发送的 Json 最后没有数据
- python - 有人可以告诉我如何解决这个错误,我正在使用 tensorflow fashion_mnish 数据集
- java - java.lang.ClassNotFoundException: org.elasticsearch.http.AbstractHttpServerTransport
- javascript - 使用 javascript 处理来自 express 服务器的表单提交响应
- firebase - 如何在 Flutter 的同一屏幕中管理两个带有数据的 ListView
- c# - C#继承模板和种姓
- ios - 集合视图中的水平滚动
- arrays - mongodb聚合两个数组请求