gestureRecognition
这段代码定义了一个名为 gestureRecognition 的函数,它用于识别手势并显示在摄像头或指定图像上。以下是对代码的详细注释:
1. 初始化一个空字符串 ges,用于存储手势结果。如果 self.hand 未定义,则将其设置为 hands(0,2,0.6,0.5),这是一个表示手势检测参数的元组。
2. 根据 target 参数的值判断是使用摄像头还是指定图像。如果 target 等于 "camera",则调用 self.open_camera() 打开摄像头。然后使用 self.cap.read() 从摄像头读取图像。否则,从指定图像文件中读取图像。
3. 如果读取的是摄像头图像,则翻转图像以适应手势检测模型。
4. 使用 self.hand 对象运行手势检测模型,并将结果存储在 datas 变量中。self.hand 对象是通过调用 hands(0,2,0.6,0.5) 创建的,其中参数分别为手势检测的阈值、检测精度、最小手部面积和最大手部面积。
5. 拆分图像的三个颜色通道(蓝色、绿色和红色),然后将它们合并成一个图像。
6. 遍历 datas 中的数据,绘制手势检测结果。首先绘制矩形框、手部中心点和手势角度。然后根据 right_left 值判断是左手还是右手,并在相应位置绘制手势角度。最后,绘制手部特征点。
7. 将处理后的图像转换为 Image 对象并显示在 self.display 上。
8. 如果 ges 仍然为空,说明没有检测到有效的手势,返回 None。否则,返回手势结果(ges)和手部中心点(center)。
这个函数可以用于实时手势识别或对指定图像进行分析。手势识别模型依赖于 self.hand 对象,其参数需要根据具体应用场景进行调整。
def gestureRecognition(self,target="camera"):
ges = ''
if self.hand==None:
self.hand = hands(0,2,0.6,0.5)
if target=="camera":
self.open_camera()
success,image = self.cap.read()
else:
image=np.array(Image.open(target))
image = cv2.flip(image,1)
datas = self.hand.run(image)
b,g,r = cv2.split(image)
image = cv2.merge((r,g,b))
for data in datas:
rect = data['rect']
right_left = data['right_left']
center = data['center']
dlandmark = data['dlandmark']
hand_angle = data['hand_angle']
XGOEDU.rectangle(self,image,rect,"#33cc00",2)
#XGOEDU.text(self,image,right_left,center,2,"#cc0000",5)
if right_left == 'L':
XGOEDU.text(self,image,hand_pos(hand_angle),(180,80),1.5,"#33cc00",2)
elif right_left == 'R':
XGOEDU.text(self,image,hand_pos(hand_angle),(50,80),1.5,"#ff0000",2)
ges = hand_pos(hand_angle)
for i in dlandmark:
XGOEDU.circle(self,image,i,3,"#ff9900",-1)
imgok = Image.fromarray(image)
self.display.ShowImage(imgok)
if ges=='':
return None
else:
return(ges,center)
gestureRecognition的更多相关文章
- 学习笔记之Machine Learning Crash Course | Google Developers
Machine Learning Crash Course | Google Developers https://developers.google.com/machine-learning/c ...
- BCS SET EMAIL
FUNCTION zcrm_send_email. *"------------------------------------------------------------------- ...
- [New learn] UIKit 框架类
NSObject NSObject is the root class of most Objective-C class hierarchies. NSDataAsset The NSDataAss ...
- 【iOS翻译】对UIGestureRecognizer多种手势傻傻分不清
UIGestureRecognizerDelegate A set of methods implemented by the delegate of a gesture recognizer to ...
随机推荐
- ASL单芯片CS5366TypeC转HDMI4K60HZ加HUB多口方案|CS5366带PD拓展方案原理图
CS5366芯片是ASL集睿致远最新推出的2Len带PD的扩展坞方案芯片,CS5366支持4K60HZ. 在分辨率4K下,刷新率60HZ对于30HZ看似提升不多,但是对于应用在游戏主座的客户来说至关重 ...
- 🎉Avalonia 11.0.0 正式版发布
Avalonia 11.0.0 正式版发布! AvaloniaUI 发布11.0.0正式版 终于avalonia发布了正式版. 更新内容 A11y(辅助功能) 这个版本的Avalonia在使应用程序更 ...
- Vue + Element ui 实现动态表单,包括新增行/删除行/动态表单验证/提交功能
总结/朱季谦 最近通过Vue + Element ui实现了动态表单功能,该功能还包括了动态表单新增行.删除行.动态表单验证.动态表单提交功能,趁热打铁,将开发心得记录下来,方便以后再遇到类似功能时, ...
- Centos 7安装JDK1.8
# 安装 yum install -y java-1.8.0-openjdk* # 添加环境变量 vim /etc/profile export JAVA_HOME=/usr/lib/jvm/java ...
- ASP.NET MVC4 学习笔记-1
初学ASP.NET MVC,通过博客来记录自己的学习笔记! 创建一个新的 ASP.NET MVC 项目 在新建项目中选择 ASP.NET MVC4 Web Application,项目类型为空,视图引 ...
- 【SpringBoot】定时任务
SpringBoot实现定时任务 SpringBoot创建定时任务,目前主要有以下三种实现方式: 基于注解(@Scheduled): 基于注解@Scheduled默认为单线程,开启多个任务时,任务的执 ...
- selenium 根据期刊信息获取知网文献信息 pt.1
哈喽大家好,我是咸鱼 之前写过一篇获取知网文献信息的文章(关于<爬取知网文献信息>中代码的一些优化),看了下后台数据还挺不错 所以咸鱼决定再写一篇知网文献信息爬取的文章 需要注意的是文章只 ...
- java协程线程之虚拟线程
前言 众所周知,java 是没有协程线程的,在我们如此熟知的jdk 1.8时代,大佬们想出来的办法就是异步io,甚至用并行的stream流来实现,高并发也好,缩短事件处理时间也好:大家都在想着自己认为 ...
- jquery解决跨域问题
在Ajax请求的url不是本地或者同一个服务器下面的URI,最后虽然请求显示为200,但是不会返回任何数据,事实上简单来说请求同一个域名下的url或者说用不带http的绝对路径和相对路径请求是没有任何 ...
- Flutter状态管理-FlyingRedux
简介 Flying Redux 是一个基于Redux状态管理的组装式flutter应用框架. 它有四个特性: 函数式编程 可预测的状态 插拔式的组件化 支持null safety 和 flutter ...