⼿势控制Python!LeapMotionPython开发教程(⼆)
⼿势控制 Python !Leap Motion Python 开发教程 (⼆)
现在进⼊正题,我来给⼤家总结⼀下我在使⽤ Leap Motion 开发过程中的经验以及学到的东西,其中我会概括以及翻译官⽅给出的注释,为了让这些注释更加通俗易懂,让⼤家更好理解。
回顾
在上⼀篇⽂章中我们讲了如何配置 Leap Motion 的 Python 2.7 的开发环境,如果您还没有配置好您的开发环境,可以参考我写的第⼀篇⽂章
A. 介绍
官⽅对于Leap Motion给出的参数:
将Leap Motion 平放与桌⾯时,从 Leap Motion向上的⽅向作为Y轴的正向。在检测时,Leap Motion 具有⼤约 150度 的视⾓,并且可以在25mm-600mm的距离中检测出⼈的⼿势。
(左:Leap Motion 对⼈⼿的视⾓, 右 :Leap Motion 的坐标系)
在 Leap Motion 中的单位分别是:
距离毫⽶(mm)
时间微秒(ms)
速度毫⽶每秒(mm/s)
⾓度弧度(radian)
B. 结构
下⾯是本⼈总结的Leap Motion 的结构,省略了部分对于我们获取数据不是特别重要的类,有兴趣的朋友可以在 查阅
其中要指出,想要在frame中获得 gesture (⼿势)必须在创建controller之后使⽤ able_gesture() 开启获得⼿势的通道,系统默认的是否哦。下⾯放⼀个⽰例代码,然后会分开细讲每⼀个类。
import sys
sys.path.insert(0,"lib")
import Leap
import thread, time
import random
class SimpleListener(Leap.Listener):
finger_names =['Thumb','Index','Middle','Ring','Pinky']
bone_names =['Metacarpal','Proximal','Intermediate','Distal']
def on_init(self, controller):
print"Initialized"
def on_connect(self, controller):
print"Connected"
def on_disconnect(self, controller):
# Note: not dispatched when running in a debugger.
print"Disconnected"
python是做什么的通俗易懂的def on_exit(self, controller):
print"Exited"
def on_frame(self, controller):
# Get the most recent frame and report some basic information
frame = controller.frame()
for hand in frame.hands:
print"There is a Hand!"
def main():
# Create a sample listener and controller
listener = SampleListener()
controller = Leap.Controller()
# Have the sample listener receive events from the controller
controller.add_listener(listener)
# Keep this process running until Enter is pressed
print"Press Enter "
try:
adline()
except KeyboardInterrupt:
pass
finally:
# Remove the sample listener when done
if __name__ =="__main__":
main()
B.1 Controller
最⼤的类,在代码中代表了你的 Leap Motion Controller, 必须创建此类 ⽤于获取所有⼿指数据。同时也必须⾃⼰创建 listerner 类,并使⽤ controller.add_listener() 添加你创建的 listener。
在⼀个 controller 有了 listener 后,运⾏代码后 controller 会⾃动初始化⾃⼰,并且运⾏所添加的 listener 中的on_init() 函数
B.2 Listener
我们来看这个最简单的Listener 例⼦
class SampleListener(Leap.Listener):
finger_names =['Thumb','Index','Middle','Ring','Pinky']
bone_names =['Metacarpal','Proximal','Intermediate','Distal']
def on_init(self, controller):
print"Initialized"
def on_connect(self, controller):
print"Connected"
def on_disconnect(self, controller):
# Note: not dispatched when running in a debugger.
print"Disconnected"
def on_exit(self, controller):
print"Exited"
def on_frame(self, controller):
# Get the most recent frame and report some basic information
frame = controller.frame()
for hand in frame.hands:
print"There is a Hand!"
⾃⼰重写 Listener 需要重写的函数:
1. on_init()
2. on_connect()
3. on_disconnect()
4. on_exit()
5. on_frame()
其中 on_init(),on_connect(),on_disconnect(),on_exit() 只有在controller做出相应活动时才会发⽣,但是on_frame() 是每当controller 获得新的⼀帧都会被执⾏⼀遍。
如果你的程序需要实时更新,可以把on_frame() 当作⼀个callback()函数来⽤。如果你只需要每隔⼀段时间获取以下controller的数据,即可把on_frame()定义为:
def on_frame(self,controller):
return
然后当你需要frame的数据时,调⽤ controller.frame() 函数,这样会节省不必要的运算,让你的程序更加流畅!
B.3 Frame
接下来这⼏个类就是我们数据的集合,以下是各各数据的获得⽅法
frame = controller.frame()# 返回⼀个frame 物体
hands = frame.hands #返回⼀个有 n 个物体的list,n为检测到的⼿的数量
fingers = frame.fingers #返回⼀个有 n 个物体的list,n为检测到的⼿指的数量
B.4 hand , finger , bone , joint
hand 获取⽅法:
hands = frame.hands
finger 获取⽅法:
# 1. 获取当前 frame 下所有检测到的⼿指
fingers = frame.fingers
# 2. 获取⼀个指定的 hand 下的所有检测到的⼿指
fingers = hand.fingers
其中,⼀个fingers⾥⾯包含的数据顺序为 [⼤拇指,⾷指,中指,⽆名指,⼩拇指]
bone 获取⽅法:
bone0 = finger.bone(0)#Metacarpal
bone1 = finger.bone(1)#Proximal Phalange
bone2 = finger.bone(2)#Intermediate Phalange
bone3 = finger.bone(3)#Distal Phalange
对应的⼿指请查看下图,其中,⼤拇指只有三个⾻头,所以在⼤拇指中 finger.bone(0) 返回的数据为空
joint 获取⽅法:
prevJoint = bone.prev_joint
nextJoint = _joint
⼀个 bone 的prev_joint 和 next_joint 参数都是⼀个包含double的坐标,顺序为 (x,y,z)
好了,就讲这么多了,如果⼤家还有问题的话欢迎留⾔下⽅!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论