基于opencv实现抖音上墨镜和烟卷效果

现今较火的抖音上有一个十分有趣的特效,其可以自动检测出人脸并且放置墨镜和烟卷,鉴于此,想自己实现动手实现以下该特效的制作。

二、工作环境

Python 3.6,opencv+Dlib,Windows操作系统,pycharm

三、流程


  • 从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像。

  • 程序启动后,根据监听器信息,使用一个while循环,不断的加载视频图像,然后返回给opencv工具呈现图像信息。

  • 创建一个键盘事件监听,按下"d"键,则开始执行面部匹配,并进行面具加载(这个过程是动态的,你可以随时移动)。

  • 面部匹配使用Dlib中的人脸检测算法来查看是否有人脸存在。如果有,它将为每个人脸创建一个结束位置,眼镜和烟卷会移动到那里结束。

  • 然后我们需要缩放和旋转我们的眼镜以适合每个人的脸。我们将使用从Dlib的68点模型返回的点集来找到眼睛和嘴巴的中心,并为它们之间的空间旋转。

  • 在我们实时获取眼镜和烟卷的最终位置后,眼镜和烟卷从屏幕顶部进入,开始匹配你的眼镜和嘴巴

  • 假如没有人脸,程序会直接返回你的视频信息,不会有面具移动的效果。默认一个周期是4秒钟。然后你可以通过"d"键再次检测。

  • 退出程序按下q键。

四、关键代码


创建面具加载服务类DynamicStreamMaskService及其对应的初始化属性:

读取摄像头视频流并转化为图象:

实现人脸定位函数,及眼镜和烟卷的定位:

接下来实现画图函数:

创建启动函数start:

五、运行结果


运行后,首先会打开摄像头,然后按下键盘d键,就会看到墨镜和烟卷从屏幕上方出来,自动定位到眼睛和嘴巴。参考结果如下:

图片经过马赛克处理了。

注意


代码中需要调用 shape_predictor_68_face_landmarks.dat人脸库,需要下载,然后在代码调用处中指定路径即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个简单的Python + OpenCV实现人脸添加墨镜特效的例子: ```python import cv2 # 加载人脸分类器 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 加载墨镜图像 glasses = cv2.imread('glasses.png', -1) # 打开摄像头 cap = cv2.VideoCapture(0) while True: # 读取摄像头帧 ret, frame = cap.read() # 转换帧至灰度图像 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 检测人脸 faces = face_cascade.detectMultiScale(gray, 1.3, 5) # 在每个检测到的人脸上添加墨镜 for (x, y, w, h) in faces: # 调整墨镜尺寸以适应人脸大小 glasses_resized = cv2.resize(glasses, (w, int(h/2))) # 计算墨镜的位置,并将其放入帧中 x_offset = x y_offset = int(y + h/3) x_end = x_offset + glasses_resized.shape[1] y_end = y_offset + glasses_resized.shape[0] # 检查墨镜是否超出帧的边界 if x_offset < 0 or y_offset < 0 or x_end > frame.shape[1] or y_end > frame.shape[0]: continue alpha_s = glasses_resized[:, :, 3] / 255.0 alpha_l = 1.0 - alpha_s for c in range(0, 3): frame[y_offset:y_end, x_offset:x_end, c] = (alpha_s * glasses_resized[:, :, c] + alpha_l * frame[y_offset:y_end, x_offset:x_end, c]) # 显示帧 cv2.imshow('frame', frame) # 按下q键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放资源 cap.release() cv2.destroyAllWindows() ``` 这个例子中使用了OpenCV的人脸分类器来检测人脸,然后在每个检测到的人脸上添加墨镜。为了调整墨镜的大小以适应人脸,我们使用了OpenCV的 `resize()` 函数。在将墨镜加入帧中时,我们需要将其透明度考虑在内,以免墨镜覆盖了人脸。最后,我们使用OpenCV的`imshow()`函数显示帧,按下`q`键退出循环。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员奇奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值