在完成了之前提到的工作之后,发现在实际操作的时候,存在一定的问题:
(1)由于识别的是轮廓凸缺陷,所以得到的最终结果是一个点组,包括起始点、结束点、最远点和到最远点之间的距离。在实际运用中。想要用一个3D的手部模型与识别出来的手部进行绑定。因为涉及手掌整体和各个手指的移动,所以需要对手掌和手指分别进行定位。但是由于只保存了五个指尖点,所以采用平均的方法计算出中心点。由于指尖位置存在一定程度的跳变,所以实验效果并不理想,容易出现手掌和手指的分离。
(2)由于基于颜色识别,所以受到背景环境色的影响较大。当背景色过于杂乱或者接近肤色时,会产生一定的影响。目前的解决方案是,采购了外置摄像头,保持摄像头垂直角度从上向下拍摄,人手能够平摊在键盘区域上方。构思或许带上颜色比较鲜艳的手套也是一种解决方案。
下面是对问题(1)的解决方案。
要实现检测到的手部位置和环境中模型的实时更新,就需要一定的数据传递。将获取到的手部信息实时传递给环境中的模型,只需要在模型脚本中获取手部识别脚本上的变量即可。
这个过程中,需要注意的是,手部识别的脚本坐标属于UGUI的坐标,而模型的坐标属于世界坐标。直接采用坐标xyz值的传递,会导致位置出错,需要使用一个函数进行坐标之间的转换。
public Vector3 WorldToUI(Camera camera,Vector3 pos){
CanvasScaler scaler = GameObject.Find("Canvas").GetComponent<CanvasScaler>();
float resolutionX =