当前位置: 首页 > news >正文

MediaPipe 与 OpenCV 的结合——给心爱的人画一个爱心吧~

目录

概要

实现思路

整体代码实现

效果展示

总结


概要

        实时手部检测与绘图应用,通过摄像头捕捉视频流,使用 MediaPipe 识别手部关键点,判断食指是否伸展且其他手指是否弯曲,在满足条件时在画布上绘制圆点,并实时显示合成的图像,支持用户通过按 'q' 键退出。难道你就不想使用这个功能给你的女朋友画一个爱心吗?

实现思路

  • 导入库

    • 导入 OpenCV 用于图像处理和视频流操作,导入 MediaPipe 用于手部检测和关键点识别。
  • 初始化手部模块

    • 使用 MediaPipe 的手部模块,创建一个手部检测对象,以便后续进行手部关键点的识别。
  • 设置摄像头

    • 使用 OpenCV 打开摄像头,准备读取视频流。
  • 循环处理视频流

    • 进入一个循环,持续读取摄像头的视频帧,直到摄像头关闭或用户终止。
  • 镜像翻转

    • 对每一帧进行水平翻转,以消除镜像效果,使用户看到的画面更自然。
  • 颜色转换

    • 将 BGR 格式的帧转换为 RGB 格式,以适应 MediaPipe 的处理需求。
  • 手部关键点识别

    • 通过 MediaPipe 处理 RGB 帧,得到手部的关键点数据。
  • 创建画布

    • 初始化一个画布,用于存储绘制的内容,最初用第一帧的图像填充。
  • 手部标记绘制

    • 如果检测到手部关键点,遍历每个手的关键点,并在视频帧上绘制手部连接线。
  • 手指状态判断

    • 获取食指和其他手指的关键点位置,通过比较坐标判断食指是否伸展和其他手指是否弯曲。
  • 绘制逻辑

    • 如果条件满足(食指伸展且其他手指弯曲),则在画布上绘制一个圆点,表示绘图操作。
  • 结果显示

    • 将当前帧和画布合成一张图像,通过 OpenCV 的窗口显示出来,让用户看到实时绘图效果。
  • 退出机制

    • 设置按键事件,当用户按下 'q' 键时,退出循环,释放摄像头并关闭所有窗口。

整体代码实现

import cv2
import mediapipe as mp
import time# 初始化 MediaPipe 手部模块
mp_hands = mp.solutions.hands
hands = mp_hands.Hands()# 初始化画布
canvas = None# 初始化摄像头
cap = cv2.VideoCapture(0)# 初始化 FPS 计数
fps_counter = 0
fps_start_time = time.time()while cap.isOpened():ret, frame = cap.read()if not ret:break# 翻转帧以消除镜像效果frame = cv2.flip(frame, 1)# 转换颜色空间frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)results = hands.process(frame_rgb)# 创建画布if canvas is None:canvas = frame.copy()# 绘制手部标记并检测手指位置if results.multi_hand_landmarks:for hand_landmarks in results.multi_hand_landmarks:mp.solutions.drawing_utils.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)# 获取手指位置index_finger_tip = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP]index_finger_dip = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_DIP]middle_finger_tip = hand_landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_TIP]ring_finger_tip = hand_landmarks.landmark[mp_hands.HandLandmark.RING_FINGER_TIP]pinky_tip = hand_landmarks.landmark[mp_hands.HandLandmark.PINKY_TIP]# 判断手指状态index_straight = index_finger_tip.y < index_finger_dip.y  # 食指是否伸展other_fingers_curled = (middle_finger_tip.y > middle_finger_tip.y - 0.05 and  # 中指弯曲ring_finger_tip.y > ring_finger_tip.y - 0.05 and    # 无名指弯曲pinky_tip.y > pinky_tip.y - 0.05                     # 小指弯曲)# 如果食指伸展且其他手指弯曲,则绘制if index_straight and other_fingers_curled:h, w, _ = frame.shapex, y = int(index_finger_tip.x * w), int(index_finger_tip.y * h)cv2.circle(canvas, (x, y), 10, (255, 255, 0), -1)# 计算 FPSfps_counter += 1if time.time() - fps_start_time >= 1.0:fps = fps_counterfps_counter = 0fps_start_time = time.time()else:fps = 0  # 在计算间隔内不显示 FPS# 在帧上显示 FPScv2.putText(frame, f'FPS: {fps}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)# 显示结果cv2.imshow('Drawing with Hand', cv2.addWeighted(frame, 0.5, canvas, 0.5, 0))if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

效果展示

手部绘制boke

总结

        我说白了,我白说了,不总结了

相关文章:

MediaPipe 与 OpenCV 的结合——给心爱的人画一个爱心吧~

目录 概要 实现思路 整体代码实现 效果展示 总结 概要 实时手部检测与绘图应用&#xff0c;通过摄像头捕捉视频流&#xff0c;使用 MediaPipe 识别手部关键点&#xff0c;判断食指是否伸展且其他手指是否弯曲&#xff0c;在满足条件时在画布上绘制圆点&#xff0c;并实时显…...

心觉:成大事,不怕慢,就怕站

Hi&#xff0c;我是心觉&#xff0c;带你用潜意识化解各种焦虑、内耗&#xff0c;建立无敌自信&#xff1b;教你财富精准显化的实操方法&#xff1b;关注我,伴你一路成长&#xff01; 每日一省写作213/1000天 今天咱们聊聊一个不太花哨&#xff0c;但超重要的话题&#xff1a…...

练习LabVIEW第二十三题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第二十三题&#xff1a; 建立一个枚举控件&#xff0c;其内容为张三、李四、王五共三位先生&#xff0c;要求当枚举控件显…...

集成对接案例分享:金蝶云与聚水潭数据对接

金蝶云星空与聚水潭的采购入库单数据集成案例分享 在企业信息化管理中&#xff0c;数据的高效流转和准确对接是提升业务效率的关键。本文将深入探讨如何通过轻易云数据集成平台&#xff0c;实现金蝶云星空中的采购入库单数据无缝对接到聚水潭系统中的其他入库单。 本次集成方…...

高级主题-灾难恢复与业务连续性

第一节&#xff1a;灾难恢复与业务连续性 灾难恢复与业务连续性概述 灾难恢复&#xff08;Disaster Recovery, DR&#xff09;和业务连续性&#xff08;Business Continuity, BC&#xff09;是确保企业能够在遭遇灾难或意外中断后迅速恢复正常运营的关键措施。以下是一些基本…...

R语言实现随机森林分析:从入门到精通

随机森林&#xff08;Random Forest&#xff09;是一种流行的机器学习算法&#xff0c;它通过集成多个决策树来提高预测的准确性和鲁棒性。在R语言中&#xff0c;我们可以使用randomForest包来实现随机森林分析。本文将详细介绍如何使用R语言进行随机森林分析&#xff0c;包括数…...

【vs2022】windows可用的依赖预编译库

ffmpeg 、x264 、x265 等。obs是基于qt6+vs2022+64bit obs的官网传统构建已经不用了obs的s2022构建OBS Deps Build 2024-09-12FFmpeg4.4 库,x64 可用。...

基础设施即代码(IaC):自动化基础设施管理的未来

随着云计算和大规模分布式系统的迅速发展,手动管理和配置基础设施的传统方式已逐渐跟不上快速迭代的步伐。于是,基础设施即代码(Infrastructure as Code,IaC)作为一种创新实践,成为现代运维管理的基础。IaC不仅提高了基础设施的配置速度,还提升了系统的一致性和可重复性…...

C# 创建型设计模式----原型模式

1、值类型与引用类型、深拷贝与浅拷贝。 在了解原型模式前得先对这四个知识点有些了解。我先简单介绍一下这四个知识点。 1.1 值类型与引用类型(C#仅有这两种数据类型) 值类型: 常见的值类型&#xff1a;int、long、short、byte、float、double、bool、char、Struct&#xf…...

Python数据分析NumPy和pandas(十五、pandas 数据加载、存储和文件格式)

大多数时候&#xff0c;我们要处理分析的数据是存储在不同格式的文件中的&#xff0c;有txt、csv、excel、json、xml以及二进制等磁盘文件格式&#xff0c;还有时候是从数据库以及从Web API中交互获取要处理的数据。现在开始学习如何用pandas从以上内容中输入和输出数据。 读取…...

正则表达式以及密码匹配案例手机号码脱敏案例

目录 正则表达式 什么是正则表达式 语法 定义变量 test方法 exec方法 replace方法 match方法 修饰符 元字符 边界符 单词边界 字符串边界 边界符&#xff1a;^ 边界符&#xff1a;$ 量词 * ? {n} {n,} {n,m} 字符类 []匹配字符集合 .匹配除换行符之外的…...

五、数组切片make

数组&切片&make 1. 数组2. 多维数组3. 切片3.1 直接声明新的切片函数构造切片3.3 思考题3.4 切片和数组的异同 4. 切片的复制5. map5.1 遍历map5.2 删除5.3 线程安全的map 6. nil7. new和make 1. 数组 数组是一个由固定长度的特定类型元素组成的序列&#xff0c;一个数…...

SSA-CNN-LSTM-MATT多头注意力机制多特征分类预测

SSA-CNN-LSTM-MATT多头注意力机制多特征分类预测 目录 SSA-CNN-LSTM-MATT多头注意力机制多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现SSA-CNN-LSTM-MATT麻雀算法优化卷积神经网络-长短期记忆神经网络融合多头注意力机制多特征分类预测&…...

51单片机完全学习——LCD1602液晶显示屏

一、数据手册解读 通过看数据手册我们需要知道&#xff0c;这个屏幕每个引脚的定义以及如何进行发送和接收。通过下面这张图我们就可以知道&#xff0c;这些引脚和我们的编程是有关的&#xff0c;需要注意的是&#xff0c;这里我们在接线的时候&#xff0c;一定要把DB0-DB7接到…...

【知识科普】今天聊聊前端打包工具webpack

文章目录 webpack概述1. 入口&#xff08;Entry&#xff09;2. 输出&#xff08;Output&#xff09;3. Loader4. 插件&#xff08;Plugins&#xff09;5. 模式&#xff08;Mode&#xff09;6. 浏览器兼容性&#xff08;Browser Compatibility&#xff09;7. 环境&#xff08;En…...

雷池社区版中升级雷池遇到问题

关于升级后兼容问题 版本差距过大会可能会发生升级后数据不兼容导致服务器无法起来 跨多个版本&#xff08;超过1个大版本号&#xff09;升级做好数据备份&#xff0c;遇到升级失败可尝试重新安装解决 升级提示目录不对 在错误的目录下执行&#xff08;比如 safeline 的子目…...

C++基础:constexpr,类型转换和选择语句

constexpr 提到constexpr&#xff0c;我们会发现它和const类比 常和const类比constexpr符号常量必须给定一个在编译时已知的值&#xff0c; 若某个变量初始化时的值在编译时未知&#xff0c;但初始化后绝不变。 #include<iostream> #include<vector> #include&l…...

STM32 RTC时间无法设置和读取

hal_stm32_RTC函数_stm32 hal rtc-CSDN博客 STM32入门HAL库-RTC实时时钟_hal rtc-CSDN博客 参考了这些博客&#xff0c;是调试发现无法读取正确的时间&#xff0c;日期可以 通过读hal库的文件找到原因 --RTC_BINARY_ONLY模式&#xff0c;只有 sTime->SubSeconds only is …...

go语言中defer用法详解

defer 是 Go 语言中的一个关键字&#xff0c;用于延迟执行某个函数或语句&#xff0c;直到包含它的函数返回时才执行。defer 语句在函数执行结束后&#xff08;无论是正常返回还是由于 panic 返回&#xff09;都将执行。 defer 的基本用法 延迟执行&#xff1a; 当你在一个函数…...

iOS 18.2开发者预览版 Beta 1版本发布,欧盟允许卸载应用商店

苹果今天为开发人员推送了iOS 18.2开发者预览版 Beta 1版本 更新&#xff08;内部版本号&#xff1a;22C5109p&#xff09;&#xff0c;本次更新距离上次发布 Beta / RC 间隔 2 天。该版本仅适用于支持Apple Intelligence的设备&#xff0c;包括iPhone 15 Pro系列和iPhone 16系…...

【SQL】SQL函数

&#x1f4e2; 前言 函数 是指一段可以直接被另一段程序调用的程序或代码。主要包括了以下4中类型的函数。 字符串函数数值函数日期函数流程函数 &#x1f384; 字符串函数 ⭐ 常用函数 函数 功能 CONCAT(S1,S2,...Sn) 字符串拼接&#xff0c;将S1&#xff0c;S2&#xff0…...

NSSCTF刷题篇web部分

源码泄露 [FSCTF 2023]寻找蛛丝马迹 这个源码泄露&#xff0c;可以记录一下&#xff0c;涉及的知识点比较多 打开环境 查看源码&#xff0c; 第一段flag 乱码&#xff0c;恢复一下 乱码恢复网站&#xff1a;乱码恢复 (mytju.com) 剩下的就只说方法 http://node4.anna.nss…...

超子物联网HAL库笔记:准备篇

超子物联网 HAL库学习 汇总入口&#xff1a; 超子物联网HAL库笔记&#xff1a;[汇总] 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 1. HAL库简介 HAL库 HAL库&#xff08;Hardware Abstraction Layer&#…...

FoRAG:面向网络增强型长文本问答的事实优化检索增强生成方法

人工智能咨询培训老师叶梓 转载标明出处 检索增强生成技术尽管出现了各种开源方法和商业系统&#xff0c;如Bing Chat&#xff0c;但生成的长文本答案中缺乏事实性和清晰逻辑的问题仍未得到解决。为了解决这些问题&#xff0c;来自蚂蚁集团和清华大学的研究者们提出了一种名为…...

Android NSD局域网发现服务

近期在了解局域网发现服务的时候无意间看到Android 自带的&#xff08;Network Service Discovery&#xff09;网络发现服务&#xff0c;在一番验证之后发现实现比较简单&#xff0c;可靠性也高&#xff0c;因此在这里做一个整理&#xff0c;算是对自己知识做一个归档。 网络服…...

算法的学习笔记—左旋转字符串(牛客JZ58)

&#x1f600;前言 在程序设计中&#xff0c;字符串处理问题屡见不鲜&#xff0c;其中“字符串左旋”是一种常见操作&#xff0c;今天我们一起来探讨一个经典的左旋转字符串题目&#xff0c;以及一种优雅的解决方案——三步翻转法。 &#x1f3e0;个人主页&#xff1a;尘觉主页…...

Mac 上无法烧录 ESP32C3 的问题记录:A fatal error occurred:Failed to write to target RAM

文章目录 问题描述驱动下载地址问题解决&#xff1a;安装 CH343 驱动踩的坑日志是乱码 问题描述 我代码编译可以&#xff0c;但是就是烧录不上去 A fatal error occurred:Failed to write to target RAM(result was 01070000:Operation timed out) Uploaderror:上传失败&…...

ios 项目升级极光SDK

由于项目使用的是旧版本&#xff0c;隐私合规检查不通过&#xff0c;需要升级到最新版本&#xff0c; 使用cocoapods集成无法正常运行&#xff0c;.a文件找不到&#xff0c;可能项目比较久了&#xff0c;最好选择手动导入 下载最新版本SDK&#xff0c;将 SDK 包解压&#xff…...

【Java】java | logback日志配置 | 按包配置级别

一、概述 日志配置需求&#xff1a; 本地部分包开debug&#xff0c;其他路径走配置&#xff1b;只在本地环境有效 二、logback.xml配置 <!--本地调试&#xff0c;开debug--> <springProfile name"dev"><logger name"cn.hg.demo" level&quo…...

Virtuoso使用layout绘制版图、使用Calibre验证DRC和LVS

1 绘制版图 1.1 进入Layout XL 绘制好Schmatic后&#xff0c;在原理图界面点击Launch&#xff0c;点击Layout XL进入版图绘制界面。 1.2 导入元件 1、在Layout XL界面左下角找打Generate All from Source。 2、在Generate Layout界面&#xff0c;选中“Instance”&#…...