社恐人群的社交新宠:实时人脸融合互动应用

目录

简介

实现思路

1. 引入所需库

2. 人脸检测器和特征点模型的初始化

3. 打开摄像头

4. 选择覆盖的图片

5. 获取图片的尺寸

6. FPS计算初始化

7. 主循环处理每一帧

8. 人脸检测和特征点识别

9. 处理每一张检测到的人脸

10. 调整图片大小并叠加到人脸上

11. FPS计算和显示

12. 显示画面和退出条件

13. 释放资源

整体代码

原版

 显示部分脸部关键点版本

效果展示


简介

        在这个数字化日益渗透生活的时代,对于社交恐惧(社恐)群体而言,传统面对面的交流往往伴随着不小的心理压力和不安。为此这篇文章旨在成为社恐人群的福音,让他们的表达与互动更加自如、有趣且富有创意。

应用简介

       通过OpenCV和Dlib,巧妙结合高清摄像头与实时图像处理技术,实现了人脸的精准识别与跟踪。用户只需简单几步,即可将预先选择或即时拍摄的图片、贴纸、甚至是动态表情包,实时叠加在自己或他人的脸部区域上。更令人兴奋的是,这些图像元素能够随着人脸的自然移动而动态调整位置,保持完美的贴合与同步,仿佛成为你面部的一部分,让每一次眨眼、微笑都充满无限可能。

社恐人群的福音

  1. 安全社交距离:无需近距离接触,通过手机屏幕即可展现自我,有效减少社恐人群在社交场合中的紧张感,享受安全舒适的交流体验。
  2. 创意表达:提供丰富多样的图像素材库,从趣味贴纸到个性滤镜,让用户能够轻松打造出独一无二的形象,展现自我风格,打破传统社交的局限。
  3. 趣味互动:无论是线上聚会、视频通话还是直播分享,这款应用都能为参与者带来前所未有的互动乐趣,让沟通变得更加生动有趣,增进彼此间的理解和亲近感。
  4. 增强自信:通过趣味的人脸融合效果,社恐人群可以在轻松愉快的氛围中逐渐克服对社交的恐惧,提升自信心,享受与人交流的乐趣。


实现思路

通过摄像头实时检测人脸,并将用户选择的图片叠加在人脸区域上,图片会随脸部移动。程序还实时计算并显示当前帧率(FPS)。下面是实现思路的详细讲解:

1. 引入所需库

 
import cv2
import dlib
from tkinter import filedialog, Tk
import numpy as np
import time

  • cv2: 用于处理视频流、图像操作和显示。
  • dlib: 用于人脸检测和特征点识别。
  • filedialog & Tk: 用于弹出文件选择对话框,允许用户选择图片。
  • numpy: 用于处理图像和矩阵操作。
  • time: 用于计算FPS(每秒帧数)。

2. 人脸检测器和特征点模型的初始化

 
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

  • detector: dlib.get_frontal_face_detector() 初始化人脸检测器,用于检测摄像头画面中的人脸。
  • predictor: 加载 68 点面部特征模型,该模型可以在每个人脸上识别出68个特定的点,用于后续调整图像覆盖在脸上。

3. 打开摄像头

 
cap = cv2.VideoCapture(0)

  • 通过 cv2.VideoCapture(0) 打开默认的摄像头,用于实时获取视频画面。

4. 选择覆盖的图片

 
root = Tk()
root.withdraw()
image_path = filedialog.askopenfilename(title="选择一张图片")
overlay_image = cv2.imread(image_path, -1)

  • 使用 Tkfiledialog 生成文件选择对话框,用户可以从文件系统中选择一张图片。
  • cv2.imread(image_path, -1) 用于读取图片,-1表示读取图片的四个通道(包括透明度通道)。

5. 获取图片的尺寸

 
overlay_h, overlay_w = overlay_image.shape[:2]

  • 获取用户选择的图片的高和宽,用于后续调整图片大小以适应人脸区域。

6. FPS计算初始化

 
fps = 0
prev_time = 0

  • 初始化 fpsprev_time 用于计算每秒的帧率,后面会通过两帧之间的时间差来计算当前帧率。

7. 主循环处理每一帧

 
while True:cur_time = time.time()ret, frame = cap.read()if not ret:break

  • 开始主循环,程序不断从摄像头获取帧数据。
  • 使用 cap.read() 捕获当前帧,frame 是当前的图像,ret 表示是否成功读取。
  • cur_time = time.time() 记录当前帧的时间,用于之后计算FPS。

8. 人脸检测和特征点识别

 
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = detector(gray)

  • 将每一帧转换为灰度图像,因为人脸检测在灰度图中更为高效。
  • 使用 detector(gray) 在灰度图上检测人脸,faces 是一个包含检测到的所有人脸信息的列表。

9. 处理每一张检测到的人脸

 
for face in faces:landmarks = predictor(gray, face)x1, y1 = face.left(), face.top()x2, y2 = face.right(), face.bottom()face_w = x2 - x1face_h = y2 - y1

  • 对于每一张检测到的人脸,使用 predictor 通过68个点识别面部特征。
  • 通过 face.left()face.top()face.right()face.bottom() 获取人脸的边界框,并计算其宽度 face_w 和高度 face_h

10. 调整图片大小并叠加到人脸上

 
resized_overlay = cv2.resize(overlay_image, (face_w, face_h))

  • 使用 cv2.resize() 将用户选择的图片调整为与人脸相同的大小。
 
if resized_overlay.shape[2] == 4:overlay = resized_overlay[:, :, :3]mask = resized_overlay[:, :, 3]mask = cv2.merge([mask, mask, mask])mask = mask / 255.0
else:overlay = resized_overlaymask = np.ones(overlay.shape, dtype=np.float32)

  • 如果图片带有Alpha通道(第四个通道),将Alpha通道用作透明度掩码,mask 用于控制图片透明部分。
  • 如果没有Alpha通道,创建一个全1的掩码。
 
roi = frame[y_offset:y_offset + face_h, x_offset:x_offset + face_w]
result = roi * (1 - mask) + overlay * mask
frame[y_offset:y_offset + face_h, x_offset:x_offset + face_w] = result.astype(np.uint8)

  • roi 是摄像头帧中与人脸区域相对应的部分。
  • 将处理后的图片与人脸区域叠加,考虑透明度,最终结果覆盖在摄像头的原始画面中。

11. FPS计算和显示

 
fps = 1 / (cur_time - prev_time)
prev_time = cur_time
cv2.putText(frame, f"FPS: {int(fps)}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

  • 通过当前帧与前一帧的时间差计算 fps
  • 使用 cv2.putText() 将帧率显示在屏幕上。

12. 显示画面和退出条件

 
cv2.imshow("Face Overlay with FPS", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):break

  • cv2.imshow() 用于显示摄像头画面,并将图片叠加在人脸上。
  • cv2.waitKey(1) 检测键盘输入,如果按下了 q 键,退出循环。

13. 释放资源

 
cap.release()
cv2.destroyAllWindows()

  • 释放摄像头资源并关闭所有OpenCV窗口。


整体代码

原版

import cv2
import dlib
from tkinter import filedialog, Tk
import numpy as np
import time# 初始化人脸检测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')  # 下载并加载68点模型# 打开摄像头
cap = cv2.VideoCapture(0)# 用于选择图片
root = Tk()
root.withdraw()  # 隐藏主窗口
image_path = filedialog.askopenfilename(title="选择一张图片")# 读取选择的图片
overlay_image = cv2.imread(image_path, -1)  # 读取为带透明通道的图片# 获取图片的高宽
overlay_h, overlay_w = overlay_image.shape[:2]# 初始化FPS相关变量
fps = 0
prev_time = 0# 主循环:不断获取摄像头画面并检测人脸
while True:# 获取当前时间,用于计算FPScur_time = time.time()ret, frame = cap.read()if not ret:break# 将图像转换为灰度图,便于检测gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 检测人脸faces = detector(gray)for face in faces:# 使用68点检测器检测面部特征点landmarks = predictor(gray, face)# 获取人脸的矩形区域x1, y1 = face.left(), face.top()x2, y2 = face.right(), face.bottom()face_w = x2 - x1face_h = y2 - y1# 调整图片大小以适应人脸resized_overlay = cv2.resize(overlay_image, (face_w, face_h))# 获取图片的透明度通道 (如果存在)if resized_overlay.shape[2] == 4:  # 如果图片有4个通道 (带Alpha通道)overlay = resized_overlay[:, :, :3]  # 图片的RGB部分mask = resized_overlay[:, :, 3]  # 图片的Alpha通道作为掩膜mask = cv2.merge([mask, mask, mask])  # 将Alpha通道扩展为3个通道mask = mask / 255.0  # 归一化到[0, 1]else:overlay = resized_overlaymask = np.ones(overlay.shape, dtype=np.float32)# 计算图片的放置位置x_offset = x1y_offset = y1# 获取原始图像的同一区域roi = frame[y_offset:y_offset + face_h, x_offset:x_offset + face_w]# 将图片叠加到脸上,考虑透明度result = roi * (1 - mask) + overlay * mask# 将叠加的结果放回原图像frame[y_offset:y_offset + face_h, x_offset:x_offset + face_w] = result.astype(np.uint8)# 计算FPSfps = 1 / (cur_time - prev_time)prev_time = cur_time# 在图像上显示FPScv2.putText(frame, f"FPS: {int(fps)}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)# 显示实时效果cv2.imshow("Face Overlay with FPS", frame)# 按下'q'键退出if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放摄像头并关闭窗口
cap.release()
cv2.destroyAllWindows()

 显示部分脸部关键点版本

import cv2
import dlib
from tkinter import filedialog, Tk
import numpy as np
import time# 初始化人脸检测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')  # 下载并加载68点模型# 打开摄像头
cap = cv2.VideoCapture(0)# 用于选择图片
root = Tk()
root.withdraw()  # 隐藏主窗口
image_path = filedialog.askopenfilename(title="选择一张图片")# 读取选择的图片
overlay_image = cv2.imread(image_path, -1)  # 读取为带透明通道的图片# 获取图片的高宽
overlay_h, overlay_w = overlay_image.shape[:2]# 初始化FPS相关变量
fps = 0
prev_time = 0# 定义需要显示的关键点索引
important_points = [36, 39, 42, 45, 30, 48, 54, 8]# 主循环:不断获取摄像头画面并检测人脸
while True:# 获取当前时间,用于计算FPScur_time = time.time()ret, frame = cap.read()if not ret:break# 将图像转换为灰度图,便于检测gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 检测人脸faces = detector(gray)for face in faces:# 使用68点检测器检测面部特征点landmarks = predictor(gray, face)# 获取人脸的矩形区域x1, y1 = face.left(), face.top()x2, y2 = face.right(), face.bottom()face_w = x2 - x1face_h = y2 - y1# 调整图片大小以适应人脸resized_overlay = cv2.resize(overlay_image, (face_w, face_h))# 获取图片的透明度通道 (如果存在)if resized_overlay.shape[2] == 4:  # 如果图片有4个通道 (带Alpha通道)overlay = resized_overlay[:, :, :3]  # 图片的RGB部分mask = resized_overlay[:, :, 3]  # 图片的Alpha通道作为掩膜mask = cv2.merge([mask, mask, mask])  # 将Alpha通道扩展为3个通道mask = mask / 255.0  # 归一化到[0, 1]else:overlay = resized_overlaymask = np.ones(overlay.shape, dtype=np.float32)# 计算图片的放置位置x_offset = x1y_offset = y1# 获取原始图像的同一区域roi = frame[y_offset:y_offset + face_h, x_offset:x_offset + face_w]# 将图片叠加到脸上,考虑透明度result = roi * (1 - mask) + overlay * mask# 将叠加的结果放回原图像frame[y_offset:y_offset + face_h, x_offset:x_offset + face_w] = result.astype(np.uint8)# 只绘制最关键的几个点for n in important_points:x = landmarks.part(n).xy = landmarks.part(n).ycv2.circle(frame, (x, y), 2, (0, 0, 255), -1)  # 使用红色圆点标记# 计算FPSfps = 1 / (cur_time - prev_time)prev_time = cur_time# 在图像上显示FPScv2.putText(frame, f"FPS: {int(fps)}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)# 显示实时效果cv2.imshow("Face Overlay with FPS and Important Landmarks", frame)# 按下'q'键退出if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放摄像头并关闭窗口
cap.release()
cv2.destroyAllWindows()

 


 

效果展示

社恐神器效果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143497.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

PowerShell install 一键部署Oracle19c

Oracle19c前言 Oracle 19c 是甲骨文公司推出的一款企业级关系数据库管理系统,它带来了许多新的功能和改进,使得数据库管理更加高效、安全和可靠。以下是关于 Oracle 19c 的详细介绍: 主要新特性 多租户架构:支持多租户架构,允许多个独立的数据库实例在同一个物理服务器上…

JAVA开源项目 校园美食分享平台 计算机毕业设计

本文项目编号 T 033 ,文末自助获取源码 \color{red}{T033,文末自助获取源码} T033,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【开源大模型生态8】这么多开源大模型

这张图片列出了多个开源的大模型,按照应用层、平台层、基础层和算力层进行了分类。下面我会为您逐一介绍这些模型及其特点: 应用层 AquilaCode: 一种用于自然语言处理的应用程序,可能是用于文本编码或解码的任务。SQLCoder: 可能是一种用于…

FLUX屠榜了小红书,平台这会也真假难辨

最近,小红书被一种新潮的AI绘图技术“屠榜”,这种技术就是FLUX。通过FLUX生成的虚拟美女照片,不仅成功“骗过”了平台审核,还让无数普通用户和商家惊讶。 越来越多人开始讨论这项技术的潜力,甚至一些并非技术玩家的用…

《SmartX ELF 虚拟化核心功能集》发布,详解 80+ 功能特性和 6 例金融实践

《SmartX ELF 虚拟化核心功能集》电子书现已发布!本书详细介绍了 SmartX ELF 虚拟化及云平台核心功能,包含虚机服务、容器服务、网络服务、存储服务、运维管理、工具服务、数据保护等各个方面。 即刻下载电子书,了解如何利用基于 SmartX ELF …

【FPGA XDMA AXI Bridge 模式】PCIe:BARs 和 AXI:BARs 含义解析

一. XDMA IP核两种模式 Xilinx的 DMA/Bridge Subsystem for PCI Express IP核中,支持普通的XDMA模式,但是这种模式只允许主机端发起PCIe 读写请求,FPGA内部无法主动发起读写请求,也即FPGA无法主动读写HOST的内存。 而该IP核的另…

c++编程(26)——智能指针

欢迎来到博主的专栏:c编程 博主ID:代码小豪 文章目录 智能指针什么是智能指针? auto_ptrunique_ptrshare_ptrshared_ptr缺陷 weak_ptr 智能指针 什么是智能指针? 智能指针是c中关于动态内存管理的重要一环,在智能指针…

力扣718-最长重复子数组(Java详细题解)

题目链接:718. 最长重复子数组 - 力扣(LeetCode) 前情提要: 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5…

Linux嵌入式相机 — 项目总结

main函数执行流程 1、初始化触摸屏 Touch_screen_Init();struct tsdev *ts NULL; ts ts_setup(NULL, 0); //以阻塞打开2、初始化 LCD LCD_Init(void); 通过 ioctl 函数获取 LCD 的固定参数、可变参数,得到分辨率、bpp、一行的长度(以字节为单位&a…

【MATLAB源码-第225期】基于matlab的计算器GUI设计仿真,能够实现基础运算,三角函数以及幂运算

操作环境: MATLAB 2022a 1、算法描述 界面布局 计算器界面的主要元素分为几大部分:显示屏、功能按钮、数字按钮和操作符按钮。 显示屏 显示屏(Edit Text):位于界面顶部中央,用于显示用户输入的表达式和…

【激励广告带来的广告收入与用户留存率的双重提升】

激励广告带来的广告收入与用户留存率的双重提升 ) 随着移动应用市场的竞争加剧,如何通过广告变现成为众多开发者关注的焦点。其中,激励广告(Rewarded Ads)凭借其用户友好、互动性强等特点,逐渐成为开发者的首选。那些…

Java——Static与final修饰的变量与方法(总结)

前言: Java语法学过一遍之后,我相信大多数和我一样脑瓜子嗡嗡的,甚至有点乱了,这时候应该自己把之前的能总结的,或者不熟悉的都要总结一遍,以便于后期的学习!! static修饰的成员变量…

[附源码]SpringBoot+VUE+Java实现人脸识别系统

今天带来一款优秀的项目:java人脸识别系统源码 。 系统采用的流行的前后端分离结构,内含功能包括 “人脸数数据录入”,“人脸管理”,“摄像头识别” 如果您有任何问题,也请联系小编,小编是经验丰富的程序员…

数码好物抢先看!2024有什么好用又实惠的好物推荐!

在数字科技日新月异的今天,各种数码好物层出不穷,它们以其先进的技术、创新的功能以及不断提升的性能,为我们的生活带来了极大的便利和乐趣。对于消费者来说,在众多的数码产品中挑选出好用又实惠的好物,无疑是一件既令…

Spring Controller

服务器控制 响应架构 Spring Boot 内集成了 Tomcat 服务器,也可以外接 Tomcat 服务器。通过控制层接收浏览器的 URL 请求进行操作并返回数据。 底层和浏览器的信息交互仍旧由 servlet 完成,服务器整体架构如下: Server: Tomcat…

电机知识总结

一.直流无刷电机(BLDC) 27N30P指有27个槽,30的极数,它的极对数:30/215,所以是15对极。 N必须是3的倍数,P必须是偶数, 电角度是电气特性,机械角度是空间特性,必须指明是谁…

Selenium等待机制:理解并应用显式等待与隐式等待,解决页面加载慢的问题

目录 引言 等待机制的重要性 显式等待(Explicit Wait) 原理 应用方式 代码示例 优点与缺点 隐式等待(Implicit Wait) 原理 应用方式 代码示例 优点与缺点 解决页面加载慢的问题 1. 合理设置等待时间 2. 优先使用显…

数据三维可视化技术的应用场景

数据三维可视化技术作为一种强大的工具,已经在各个领域展现出了巨大的应用潜力。它不仅提供了直观、生动的数据展示方式,还让用户能够更深入地理解数据间的关联和趋势。下面将探讨数据三维可视化技术的应用范围及其在不同领域中的重要性。 数据三维可视化…

控价服务如何判断高低

在当今竞争激烈的市场环境中,品牌控价成为企业发展的关键一环。许多品牌选择与第三方控价公司合作,借助其专业的电商价格监测系统,既能节省人力成本,又能获得高质量的服务。然而,如何判断第三方控价服务系统的优劣呢&a…

VirtualBox7.1.0 安装 Ubuntu22.04.5 虚拟机

环境 (1)宿主机系统:Windows10 (2)虚拟机软件:VirtualBox7.1.0 (3)虚拟机系统:Ubuntu 22.04.5 LTS (Jammy Jellyfish) 步骤 (1)第一步 &…