前两天,Up发了这么一段视频:
CATIA机械手模型实时跟踪手部动作
视频发出之后,收到很多反馈,比如:
但更多的小伙伴,还是对此表示出极大的兴趣,希望了解它背后的原理。所以今天,Up特意再写一篇文章,简述一下上面动图演示的效果是如何实现的。
其实,Up发的视频下面,已经有这么一段文字描述:
摄像头采集手部画面,通过计算机视觉相关算法,得到手部landmarks信息。对该信息处理计算,进而控制catia中的模型进行相应的运动。
今天的文章,便是在上述内容的基础上详细展开。
先说下前提,我们的代码都是在Python环境下编写的。原因很简单,我们可以站在巨人的肩膀上,直接pip安装很多现成的库,借助其中的函数,来实现我们需求的功能。
第一部分 图像采集
我们的原理是通过计算机视觉的相关算法,去计算、分析、提取一张图片里的信息。
所以第一步,就是给它一张图片!
当然,你可以拍一张手的静态照片,输入给它。
但我们需要一个动态的跟踪效果,所以,这里我们使用 opencv 这个库来通过摄像头采集图像。
请不要纠结图像与视频的区别,因为,视频的本质就是一帧一帧的图。
至于python里用opencv通过摄像头采集画面并显示,网上已经有无数的教程,这里不再赘述,仅给出关键代码。
import cv2 cap=cv2.VideoCapture(0) while True: success,img=cap.read() cv2.imshow('Image', img) cv2.waitKey(1)
通过上述代码,我们即可实现下面动图所示的效果。
Python中通过摄像头捕捉画面
第二部分 图像分析
现在,对于视频里的每一帧,我们相当于已经有了包含一只手的图片。那么如何通过图片,分析出这只手的信息呢?
我们继续踩着“巨人”的肩部往上爬!这里,我们要用到一个叫 mediapipe 的库。如同你使用手机发微信刷短视频,无需了解内部的芯片工作原理,我们也无需知道这个库里面的算法,直接调用它的函数,即可从一张图片中提取出手的信息。
import mediapipe as mp mpHands=mp.solutions.hands hands=mpHands.Hands() mpDraw=mp.solutions.drawing_utils imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) results=hands.process(imgRGB)
但问题是,从img对象里得到的这个results是个啥,我们不得而知。别着急,一步一步来。
首先,我们可以用 mediapipe 库里的 draw_landmarks,将得到的结果画在输出的图像上。
mpDraw = mp.solutions.drawing_utils for handLms in results.multi_hand_landmarks: mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)
将上述几段代码整合起来,我们便可以得到下面的效果。
将手部landmark信息体现在画面中
但这个输出结果,只是视觉上让我们直观地感受到了:程序捕捉到了手!我们如果想进一步计算分析,还是要从结果中拿到数据的。
事实上,如果你print一下 handLms.landmark 对象的话:
print(handLms.landmark)
你会得到这样的输出结果——一组包含21个xyz坐标的数据。
[x: 0.4078216850757599 y: 1.1648612022399902 z: 3.967853672293131e-07 , x: 0.44470182061195374 y: 1.1646361351013184 z: -0.030627014115452766 , x: 0.47610029578208923
y: 1.1487294435501099
…………
z: -0.05056781694293022]
其实,这些数据,对应的就是手部的一些关键点的信息,这些关键点,也就是我们前面反复提到的landmark。
手部landmark对应的21个点
至此,我们得到了足够的信息,来支撑我们进行下一步的计算。
第三部分 CATIA模型执行动作
事实上,如果我们单纯地将这些坐标在part里建成点,便可以实现映射到CATIA的效果。而关于Python通过Automation开发的方式控制CATIA,之前Up以及发过太多视频教程,甚至还写了一本书!所以这方面的内容也不再多说,直接看效果。
在Catia Part文件中建立landmark点,连线并不断更新
不过,不断地更改参数、更新模型,速度实在太慢,尤其当我们想在part里将手部模型绘制得稍微复杂/逼真一些的时候。
再简单点说:不够酷!
所以,Up从网上下载了这样一个机械手的模型:
网上随便下载的机械手3D模型
但想驱动这个模型,可能不是像在Part里改个点坐标那么简单。考虑到前面提到的更新速度问题,我们这里采用Automation开发驱动DMU的方式
所以,Up又为这个手加了一那么一丢丢的DMU运动副:
给每个关节处添加了独立驱动的DMU运动副
(哎呀!一不小心摆了个糟糕的手势……)
接下来,我们就需要用前面得到的21组xyz坐标,做进一步的计算了。
比方说,通过lm9,lm10,lm11这三个点,我们可以得到中指的两个指节的方向向量Vec1,Vec2,进而求出两个指节的夹角Angel。而这一角度,正是在lm10关节处的DMU旋转副的驱动。
通过landmark关键点进一步计算所需信息
其他关节同理。
结束语
至此,关于【CATIA机械手模型通过摄像头追踪手部运动】这一话题的技术细节,我们就都介绍完了!
但Up更希望的是,通过这个视频,以及这篇文章,引发大家对软件、对行业、对未来的思考!
在这个例子中:
基于这种理解,小编还做过下面这些实例:
……
所以,抛开CATIA软件不谈。
你的设想中,未来是什么样的呢?!