使用Kinect进行不平滑的缩放图像 - 接近时需要校正

时间:2012-01-29 08:21:36

标签: c# wpf kinect

我正在尝试使用Kinect进行放大/缩小效果。基本思路是:

  1. 检测双手是否被抬起bool lefthand, righthand;
  2. 计算指针之间​​的距离prevDistance
  3. 在拍摄的下一帧中,如果指针之间的距离小于prevDistance,则ZoomOut else ZoomIn
  4. 这对我有用,但这种方法不会导致非常平滑的放大/缩小。

        bool lefthand=false, righthand=false;
        float prevDistance=0;
    
    //Inside SkeletonFrameReady event
    
    if(lefthand && righthand && prevDistance=0)
    {
    prevDistance = skeleton.Joints[JointID.HandRight].Postion.X - skeleton.Joints[JointID.HandLeft].Position.X;
    }
    if(lefthand && righthand)
    {
    ZoomingFunction(skeleton.Joints[JointID.HandRight].Postion.X, skeleton.Joints[JointID.HandLeft].Position.X, prevDistance);
    }
    if(!lefthand && !righthand)
    {
    prevDistance =0;
    }
    

    缩放功能:

    private void ZoomingFunction(double RPostion, LPosition, double curDistance)
    {
    //0.3 has been added to get kind of integral points to zoom, else the zooming occurs very fast to control
        if(RPosition - LPosition < curDistance - 0.3F)
        {
    //Zoom out
        img.Width -=20;
        }
        if(RPosition - LPosition > curDistance + 0.3F)
        {
    //Zoom in
        img.Width +=20;
        }
    }
    

    这种方法对我来说并不是很优雅。我试图获得一些平滑的缩放效果,就像在全球望远镜的Kinect演示中一样。链接:http://www.youtube.com/watch?v=1-tMp4WkQjA

    有任何改善这方面的建议吗?

2 个答案:

答案 0 :(得分:1)

我认为这里有两个可能的问题。

第一个是错误累积。这种情况发生在每一帧上,你从SD得到手的位置+一点误差(或噪音)。我的解决方案是:

  1. 当您检测到用户抬起手并准备开始缩放时,请存储指针之间的距离和当时的缩放级别(让我们称之为startDistance and startZoom

  2. 每帧,根据原始值,原始手距和新距离计算新的缩放级别。 你可以这样做:

  3. 
    float newWidth = startWidth * currentDistance / startDistance;
    float newHeight = startHeight * currentDistance / startDistance;
    

    这应该最小化任何错误累积。

    第二个问题是为了提高缩放的平滑度,并消除可能从SDK中获得的任何噪音。这很简单。您可以尝试插入当前帧和上一帧之间的手距值。如果你真的得到噪声值,如果需要你可以尝试插入更多的帧。

    您可以这样做:

    
    float interpolatedDistance = (currentDistance + prevDistance) / 2;
    float newWidth = startWidth * interpolatedDistance / startDistance;
    float newHeight = startHeight * InterpolatedDistance / startDistance;
    prevDistance = currentDistance;
    

    其中currentDistance是此帧之间的距离与prevDistance之间的距离是前一帧中指针之间的距离。

    告诉我们这是否有帮助

答案 1 :(得分:0)

我可能建议的唯一两件事是在UIElemnt上使用ScaleTransfrom调整大小并使用绑定。唯一的另一件事是我相信它。因为你移动太高的三角洲而变得很邋..如果使用不同的增量(如1,4和6)捕获不同范围的语句,可以使用其他语句

修改

你将不得不玩这些值,但我会做这样的事情开始:

double deltaPosition = RPosition - LPosition;
if(deltaPosition  < curDistance - 0.3f)
    img.Width -= 4;

else if(deltaPosition  < curDistance - 0.2f)
    img.Width -= 2;

else if(deltaPosition  < curDistance - 0.1f)
    img.Width -= 1;

else if(deltaPosition  > curDistance + 0.3F)
    img.Width += 4;

else if(deltaPosition  > curDistance + 0.2F)
    img.Width += 2;

else if(deltaPosition  > curDistance + 0.1F)
    img.Width += 1;