近日偷闲,用谷歌之开源库mediapipe结合C#等语言,基于TCP协议模拟了一番kinect。今夜核酸检查 乘兴总结一番,因设备之故,暂不放置代码。其中若有所言有误,还望诸贤斧正。
思路图
第一部分 mediapipe的搭建
mediapipe框架应用起来并不是太难,详情可以看我第一篇拙作,唯一需要增加的是搭建一个列表用于存储骨骼点平面坐标。具体代码有空就放进来。
第二部分 平面骨骼点生成三维骨骼点
通过第一部分,我们已经得到了平面骨骼点的坐标,并将它存储在列表之中。由于所学甚少,所以我就用了一种比较烂大街的方法进行深度估算,以下是我的估算具体方法与思路。
现有的深度估计算多数依赖于小孔成像的原理,我的方法也不例外。但是现有的方法一般是先给他一个明确的深度以及长度的对应关系,然而对于人骨骼点捕捉的时候,并没有一个统一的距离与宽度对应关系,我希望将t=0时刻的人体骨骼点空间关系作为基准,即我们定义t=0时刻左肩右肩之间的宽度l为一个相对单位l0。
1、 躯干部分的深度估算
首先研究人与摄像头的相对距离。我们已经定义了t0时刻的长度l0为一个相对单位,所以对于任意时刻的l,我们可以推算出深度h=k*l/l0,在这里k为常数。当然由于人体是一个具有高度关节性的非刚体,我们很容易发现当我们在进行扭腰的动作时,这里的误差会非常的严重。所以我又导入了腰部的两个关键点,也就是说我通过判定腰部以及肩部四个点围成的四边形在不同时刻与t0时刻的相似度,来判断动作并校准深度的估算。
Media pipe原理图
2、 四肢的深度估算
由上一个环节我们已经获取了躯干部分的深度,而我们的手臂以及腿部的深度估算也是基于躯干部分的四个关键节点,分别建立坐标系进行判定的。
我们对于四肢深度的估算同样是基于t0时刻的空间关系。在t0时刻,我们推导出各个部分为几个相对单位长度,由于不同关节的长度不可能发生缩短,所以说我们在平面中测量出来的缩短现象是由于关节在图像中发生了投影现象,所以我们就可以由图像长度与t0时刻之间的比值,推导出该关节对于图像的投影角度,所以便可以基于躯干四个关键点逐步推导出其他关键点的深度。
第三部分 通讯交流
由于鄙人才疏学浅,暂时勉强算对TCP略懂一二,所以在近期的学习中,我便基于socket尝试一二,实现了C#窗台获取指令与Python中骨骼点坐标输出的数据交换流。
期望通讯效果
第四部分 小结
由于才疏学浅,暂时只是先抱大厂大腿,然而罗兰曾骂过如我一般“好读书,不求甚解”之徒。若是学有余力,“知其然且知其所以然”方为正途,愿诸君共勉。