前几天看见一位博主用mediapipe写的拖动方块,于是我就有了写一个这个代码的想法,我原本要实现的功能是一只手给另一只手带上,但是随着我对里面函数的探索,我发现有点难实现,因为他results.multi_handedness里面可以知道左右手,但是点位在hand_landmarks.landmark这个里面,hand_landmarks.landmark不管你是左手还是右手,只要是手就往里面加点。于是戴戒指这个功能我就分成了两部分,右手拇指和食指达到一定距离后可以移动,左手的中指三个点位分别穿过戒指后,戒指就随左手中指的10号点位移动。

手的点位图:

这个程序目前只可以做到戒指的一维移动,也就是说戒指还只是图片,他只能保持原有的状态直线运动,当手竖起来的时候戒指的形状和手就不匹配了,这就需要通过其他算法完成了,我目前的水平还做不到。

这是戒指图片:

由于我还不会怎么弄动图,就只有放几张截图了

import cv2
import time
import math
import numpy as np
import mediapipe as mpmp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_hands = mp.solutions.hands
hands =  mp_hands.Hands(static_image_mode=True,max_num_hands=2,min_detection_confidence=0.5)
cap = cv2.VideoCapture(0)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))img=cv2.imread("./ring.png")
ring_h,ring_w,ring_ch=img.shape
L1 = 0
L2 = 0
x=100
y=100
on_square = False
mid_12=False
mid_11=False
mid_10=False
while True:rec,frame = cap.read()frame = cv2.flip(frame,1)frame.flags.writeable = Falseframe = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)results = hands.process(frame)frame.flags.writeable = Trueframe = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)if results.multi_hand_landmarks:for hand_landmarks in results.multi_hand_landmarks:if results.multi_handedness:for hand in results.multi_handedness: #如果是右手if hand.classification[0].label=='Right':
#                         mp_drawing.draw_landmarks(      # 显示手的点位
#                             frame,
#                             hand_landmarks,
#                             mp_hands.HAND_CONNECTIONS,
#                             mp_drawing_styles.get_default_hand_landmarks_style(),
#                             mp_drawing_styles.get_default_hand_connections_style())x_list = []y_list = []for landmark in hand_landmarks.landmark:x_list.append(landmark.x)y_list.append(landmark.y)index_finger_x, index_finger_y = int(x_list[8] * width),int(y_list[8] * height)thumb_finger_x,thumb_finger_y = int(x_list[4] * width), int(y_list[4] * height)finger_distance = math.hypot((thumb_finger_x - index_finger_x), (thumb_finger_y - index_finger_y))if finger_distance < 100 :if (index_finger_x > x-10 and index_finger_x < (x + ring_h+10)) and (index_finger_y > y-10 and index_finger_y < (y + ring_w+10)):if on_square == False:L1 = index_finger_x - xL2 = index_finger_y - yon_square = Trueelse:on_square = Falseif on_square:x = index_finger_x - L1y = index_finger_y - L2if hand.classification[0].label=='Left': #如果识别为左手,处理左手中指的行为x_list = []y_list = []for landmark in hand_landmarks.landmark:x_list.append(landmark.x)y_list.append(landmark.y)                        mid_finger_12_x,mid_finger_12_y=int(x_list[12]*width),int(y_list[12]*width)mid_finger_11_x,mid_finger_11_y=int(x_list[11]*width),int(y_list[11]*width)mid_finger_10_x,mid_finger_10_y=int(x_list[10]*width),int(y_list[10]*width)
#                         if(mid_finger_12_y<y+ring_w and mid_finger_12_y>y and not mid_10):
#                             mid_12=True
#                         if(mid_finger_11_y<y+ring_w and mid_finger_11_y>y and mid_12 and mid_finger_12_x>x):
#                             mid_11=True
#                         if(mid_finger_10_y<y+ring_w and mid_finger_10_y>y and mid_11):
#                             mid_10=True
#                     if mid_10:          #跟随中指10点位移动
#这里可以先注释了省去戴的过程  x=mid_finger_10_xy=mid_finger_10_y-130overlay = frame.copy()for i in range(ring_h):#这里是将原图片中接近白色的颜色筛除,只剩余戒指颜色for j in range(ring_w):px=img[i,j]src2_beta=1   if(px[0],px[1],px[2])>=(245,245,245):continue    color=(int(px[0]),int(px[1]),int(px[2]))cv2.rectangle(frame, (x+i, y+j), (x+i,y+j),color,-1)frame = cv2.addWeighted(overlay, 0.5, frame, src2_beta, 0)cv2.imshow('frame',frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows() 

python[mediapipe]视觉之戒指随手移动相关推荐

  1. python机器人视觉编程——入门篇(下)

    目录 1 全篇概要 2 图像的读取与运算基础 2.1图像的读取 2.1.1 从磁盘的图像(.jpg,.npg,.gif等等)读取 2.1.2 从摄像头里读取图像 2.2图像的运算 2.2.1 图像的数 ...

  2. labview调用python 开发视觉_龙哥教你学视觉—tensorflow目标检测LabVIEW深度学习教程...

    购买注意事项: 1. 专属学习群和课程资料领取:成功购买后,请添加助教小姐姐的微信:18123773580,添加时请备注姓名+已购买视频.小姐姐会拉你进专属学习交流群 2. 关于发货:为了保证视频正版 ...

  3. python机器人视觉编程——入门篇(上)

    目录 1 全篇概要(主要阅读对象及内容提要) 2 python知识点之--环境及依赖的库安装简述 2.1 Python开发环境安装 2.2 Python 机器视觉模块安装 2.3 写第一个Python ...

  4. python随机抽号_随手小代码——Python 从集合中随机抽取元素

    =================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的" ...

  5. 用python做视觉检测系统_教你用 Python 做一个物体检测系统

    在本文中,我们将了解物体检测技术是什么以及可以用来解决此领域问题的几种不同方法,接着深入研究在Python中如何构建我们自己的对象检测系统.在本文结束时,您将拥有足够的知识来独自迎接不同的物体检测挑战 ...

  6. 机器视觉 python+mediapipe+opencv实现人体姿态识别(二)

    文章目录 一.mediapipe是什么? 二.使用步骤 1.引入库 2.主代码 3.运行结果 一.mediapipe是什么? mediapipe官网 二.使用步骤 1.引入库 代码如下: import ...

  7. 机器视觉 python+mediapipe+opencv实现人体姿态识别(一)

    文章目录 一.mediapipe是什么? 二.使用步骤 1.引入库 2.主代码 3.运行结果 一.mediapipe是什么? mediapipe官网 二.使用步骤 1.引入库 代码如下: import ...

  8. [python][mediapipe]摄像头人脸检测

    import cv2 import mediapipe as mp# 导入BlazeFace模型 mp_face_detection = mp.solutions.face_detection mod ...

  9. 反射如何打破封装性_打破产品建议的复杂性

    反射如何打破封装性 当前系统的真正问题(The Real Issue With the Current Sytems) With the rise of e-commerce in this era, ...

最新文章

  1. 大数据算法系列——布隆过滤器
  2. 什么是shell,shell基础由浅入深,常用的shell命令、用法、技巧
  3. Mint17 FireFox重装英文版问题
  4. 8_用opencv调用深度学习框架tenorflow、Pytorch、Torch、caffe训练好的模型(20190212)
  5. Android的多任务之路
  6. SAP BSP应用有状态和无状态行为差异比较
  7. 在新的固态硬盘只装ubuntu16.04系统,重启后无启动项解决方案
  8. php 多层 对象,php多层数组和对象的转换
  9. Spring MVC + freemarker实现半自动静态化
  10. 关于解压软件和压缩软件
  11. 计算机歌曲带歌词,mp3上怎么看歌词?我的机子说是可以显示的啊
  12. DNS中NS和SOA区别
  13. Daily reflection|腾讯云测评第一阶段汇报
  14. PyG搭建GCN前的准备:了解PyG中的数据格式
  15. 哔哩下载姬v1.3.3 B站视频下载工具
  16. TFT-LCD LVGL与硬件交互
  17. Biopython使用4:PDB结构
  18. 【移动终端应用开发】实验1:SharedPreferences的应用
  19. 前端Object.assign
  20. 学习笔记3--传感器技术

热门文章

  1. php为什么要有抽象类,通过具体程序来理解PHP里面的抽象类
  2. 计算机的桌面窗户是什么情况,电脑桌面悬浮窗记事本软件怎么添加?适合桌面显示的便签软件...
  3. BDD之单元测试(一):BDD出现的背景
  4. “EdrawMax”已损坏,无法打开。 您应该将它移到废纸篓 。完美解决问题。
  5. 图解HTTP思维导图
  6. 11肤色“场景检测器”
  7. AXI 基础第 5 讲-创建 AXI4-Lite Sniffer IP 以在赛灵思Vivado IP Integrator中使用
  8. 50种现代流行色彩调色效果Lr预设
  9. 老兵迅雷的轻装再转型
  10. QGIS+GeoServer:发布CGCS2000图层组