C++ 在Kinec图片C+中检测手与物体的接触+;

C++ 在Kinec图片C+中检测手与物体的接触+;,c++,kinect,C++,Kinect,首先:我是通过微软Visual Studio编程Kinec的新手。。。如果我的问题有点愚蠢,那么很抱歉 我想检测我的手是否接触到象限的上部;为此,我计划: Image<Gray, Byte> HandImage = GetThresholdedImage(ref bgrImage, (int)hueHand); Image<Gray, Byte> depthImageBin = depthImage.ThresholdBinary(new Gray(30), new Gr

首先:我是通过微软Visual Studio编程Kinec的新手。。。如果我的问题有点愚蠢,那么很抱歉

我想检测我的手是否接触到象限的上部;为此,我计划:

Image<Gray, Byte> HandImage = GetThresholdedImage(ref bgrImage, (int)hueHand);
Image<Gray, Byte> depthImageBin = depthImage.ThresholdBinary(new Gray(30), new Gray(255));

List<MCvBox2D> DangerAreas = new List<MCvBox2D>();
List<MCvBox2D> HandAreas = new List<MCvBox2D>();

// build list of object rectangles
DangerAreas = ProcessObjectContours(bgrImage, contoursDepthObjects, contoursHand, objectSize);
// build list of hand rectangles
HandAreas = ProcessHandContours(bgrImage, contoursHand, contoursDepthObjects, handSize);      

但是在这种形式下,由于错误,不接受
匹配形状。所以有两个问题:当我的手触碰危险区域时,这是正确的检测方法吗?如果是,如何正确处理方法
匹配形状?

我要做的是研究碰撞检测算法。 您可以很容易地获得手的位置,并将其转换为相对于矩形所在容器的2D点,然后获得危险区域矩形的2D点。然后,只需确定手点是否位于矩形点的顶部(或半径内)

要获取相对于栅格的骨架位置,所有图元都位于:

private static Point GetPosition2DLocation(SkeletonPoint position, Grid skeletonCanvas, DepthImageFrame depthFrame)
        {
            DepthImagePoint depthPoint = depthFrame.MapFromSkeletonPoint(position);
            return new Point(
                (int)(skeletonCanvas.ActualWidth * depthPoint.X / depthFrame.Width),
                (int)(skeletonCanvas.ActualHeight * depthPoint.Y / depthFrame.Height)
            );
        }
要检查两点是否相交(半径为70以内),请执行以下操作:

私有静态布尔点筛选(点项1,点项2)
{
//为中心指定半径,以便碰撞不必精确。
//待办事项可配置
常数int半径=70;
//将距离与组合半径进行比较
双dx=item2.X-item1.X;
双dy=item2.Y-item1.Y;
常数int半径=半径+半径;
如果((dx*dx)+(dy*dy)<半径*半径)
{
返回true;
}
返回false;
}

希望这是有意义的。

我要做的就是研究碰撞检测算法。 您可以很容易地获得手的位置,并将其转换为相对于矩形所在容器的2D点,然后获得危险区域矩形的2D点。然后,只需确定手点是否位于矩形点的顶部(或半径内)

要获取相对于栅格的骨架位置,所有图元都位于:

private static Point GetPosition2DLocation(SkeletonPoint position, Grid skeletonCanvas, DepthImageFrame depthFrame)
        {
            DepthImagePoint depthPoint = depthFrame.MapFromSkeletonPoint(position);
            return new Point(
                (int)(skeletonCanvas.ActualWidth * depthPoint.X / depthFrame.Width),
                (int)(skeletonCanvas.ActualHeight * depthPoint.Y / depthFrame.Height)
            );
        }
要检查两点是否相交(半径为70以内),请执行以下操作:

私有静态布尔点筛选(点项1,点项2)
{
//为中心指定半径,以便碰撞不必精确。
//待办事项可配置
常数int半径=70;
//将距离与组合半径进行比较
双dx=item2.X-item1.X;
双dy=item2.Y-item1.Y;
常数int半径=半径+半径;
如果((dx*dx)+(dy*dy)<半径*半径)
{
返回true;
}
返回false;
}
希望这有意义。

我允许自己“翻译”一点源代码。我允许自己“翻译”一点源代码。
private static bool PointsIntersecting(Point item1, Point item2)
        {
            //Give the center a radius so that collision does not have to be exact.
            //TODO configurable
            const int radius = 70;

            //compare the distance to combined radii
            double dx = item2.X - item1.X;
            double dy = item2.Y - item1.Y;
            const int radii = radius + radius;
            if ((dx * dx) + (dy * dy) < radii * radii)
            {
                return true;
            }
            return false;
        }