opencv - JibJab 类面部置换

标签 opencv video face

我正在尝试使用人脸检测和替换的样本,但我想像 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's face landmark detector检测眼睛和嘴巴,然后找到将给定面部转换为视频中面部的单应性。可能您还需要应用平滑过滤器,例如 alpha beta filter所以脸上不会显得紧张。

关于opencv - JibJab 类面部置换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50471943/

相关文章:

python - 在OpenCV中裁剪垂直轮廓,获取边框边界而不是区域

java - 将 OpenCV Mat 对象转换为 BufferedImage

php - Mysql查询多个数组值

javascript - 在 Canvas 上操纵面部细节

Three.js:将面法线从局部空间转换为世界空间

c++ - 双重自由或腐败(!prev)c++ opencv

opencv - 将cv::Vec4f行转换为cv::Vec2f

ios - 检测 "Done"按钮的点击事件(youtube视频)

c# 如何使用 DirectShow 播放加密视频?

python - 我正在使用 OpenCV 制作蒙面人脸检测应用程序,以检测戴口罩的人脸,但出现错误