繁体   English   中英

使用Kinect v2查找胸部尺寸

[英]Find chest size using Kinect v2

我需要找到任何使用Kinect的人在面对镜头时的胸部前部尺寸。 我目前的解决方案是:

  1. 当MultiFrameSource到达时获取颜色(以显示ui中的主体)主体(获取关节)和bodyIndex帧。

  2. 使用以下方法将BodyIndexFrame复制到byte [] _bodyData:

     bodyIndexFrame.CopyFrameDataToArray(_bodyData); 
  3. 我得到了Joint对象:spineShoulder和spineMid。 我认为胸部总是在这些点之间

  4. 我通过使用将两个关节转换为CameraSpacePoint(x,y,z)并从CameraSpacePoint转换为DepthSpacePoint(x,y)

     _sensor.CoordinateMapper.MapCameraPointToDepthSpace(jointPosition); 

我仍然保留对spineShoulder的z值的引用。

  1. 第二个假设=> 从spineShoulderY开始到spineMidY我试图找到播放器区域中最宽的点。 为了做到这一点,我将尝试找到spineShoulderX和找到的不属于玩家的第一个左边区域之间的最长段,以及找到不属于玩家的spineShoulderX和第一个右侧区域之间的最长段。 找到的两个x段必须位于相同的y坐标中。

     /*************** * Returns the distance between 2 points */ private static int getDistanceToMid(int pointX, int midX) { if (midX > pointX) { return (midX - pointX); } else if (pointX > midX) { return (pointX - midX); } else { return 0; } } /********* * Loops through the bodyData array * It will look for the longest x distance from midX to the last left x value * which still belongs to a player in the y coordinate */ private static int findFarLeftX(byte[] bodyData,int depthWidth, int midX, int y) { int farLeftX = -1; for (int x = midX; x >= 0; --x) { int depthIndex = (y * depthWidth) + x; if (depthIndex > 0 && depthIndex < bodyData.Length) { byte player = bodyData[depthIndex]; if (player != 0xff){ if (farLeftX == -1 || farLeftX > x) { farLeftX = x; } } else{ return farLeftX; } } } return farLeftX; } /********* * Loops through the bodyData array * It will look for the longest x distance from midX to the last right x value * which still belongs to a player in the y coordinate */ private static int findFarRightX(byte[] bodyData, int depthWidth, int midX, int y) { int farRightX = -1; for (int x = midX; x < depthWidth; ++x) { int depthIndex = (y * depthWidth) + x; if (depthIndex > 0 && depthIndex < bodyData.Length) { byte player = bodyData[depthIndex]; if (player != 0xff) { if (farRightX == -1 || farRightX < x) { farRightX = x; } else{ return farRightX; } } } } return farRightX; } private static BodyMember findElement(byte[] bodyData, int depthHeight, int depthWidth, int startX, int startY, int endY) { BodyMember member = new BodyMember(-1, -1, -1, -1); int totalMaxSum = 0; int farLeftX = -1; int farRightX = -1; int selectedY = -1; for (int y = startY; y < depthHeight && y <= endY; ++y) { int leftX = findFarLeftX(bodyData, depthWidth, startX, y); int rightX = findFarRightX(bodyData, depthWidth, startX, y); if (leftX > -1 && rightX > -1) { int leftToMid = getDistanceToMid(leftX, startX); int rightToMid = getDistanceToMid(rightX, startX); int sum = leftToMid + rightToMid; if (sum > totalMaxSum) { totalMaxSum = sum; farLeftX = leftX; farRightX = rightX; selectedY = y; } } } member.setFarLeftX(farLeftX); member.setFarLeftY(selectedY); member.setFarRightX(farRightX); member.setFarRightY(selectedY); return member; } 
  2. findElement将返回一个BodyMember对象,该对象包含farLeftX,farRightX,farLeftY和farRightY。

  3. 我创建了2个DepthSpacePoint对象:DepthSpacePoint chestX1 = new DepthSpacePoint(); chestX1.X = bodyMemberObj.getFarLeftX(); chestX1.Y = bodyMemberObj.getFarLeftY();

     DepthSpacePoint chestX2 = new DepthSpacePoint(); chestX2.X = bodyMemberObj.getFarRightX(); chestX2.Y = bodyMemberObj.getFarRightY(); 
  4. 为了获得以米为单位的真实世界坐标,必须将这些点转换为CameraSpacePoint对象。 为了做到这一点,我将使用关节的z值,我在第4点保留了对它的引用。

     CameraSpacePoint chestLeft = _sensor.CoordinateMapper.MapDepthPointToCameraSpace(chestX1,spineShoulderZ); CameraSpacePoint chestRight = _sensor.CoordinateMapper.MapDepthPointToCameraSpace(chestX1,spineShoulderZ); 
  5. 现在, 如果我的代码和假设是正确的,我应该能够获得前胸的正确距离(米)。

     double chestLength = (chestLeft.X > chestRight.X) ? chestLeft - chestRight : chestRight - chestLeft; 

但是,这似乎没有返回正确的值。 几个星期以来,我一直在寻找解决方案,但我似乎陷入困境。

我曾与Kinect V2合作过,可以说仅仅是骨架数据不足以获得可靠的结果。 即使衣服也会影响Kinect如何解释身体部位,因此您必须结合其他传感器数据的结果。

此外,我建议你对如何处理这个问题有所创造性,例如,你可以研究一些关于人体的可能的解剖学相关性,很可能身高是一个代理指标,可能是面部识别的年龄,身高是另一个暗示,等等。

你在使用kinect One吗? 旧运动中的测量结果可能不够准确,无法满足您的要求。

但是,从我的观点来看,在框架内提取移动物体也是值得的(如果在Kinect前面只有一个人,你会收到这个人的轮廓,但是为了确保你可以比较它的位置用Kinect骨架)。

你可以告诉别人在短时间内举手。 比使用Kinect到人体骨骼的距离并根据轮廓的大小和给定的距离 - 计算你肩膀下方的最终胸部测量值(从骨骼中取出的位置)。 我也不完全清楚Kinect处理“更大”人的准确程度。

以下是其中一种方法的描述: http//onlinelibrary.wiley.com/doi/10.1002/scj.10237/abstract您还可以google许多其他论文(免费)。

你怎么看待这个想法? 干杯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM