Exemplo n.º 1
0
        public void DisplayJoints(JointData[][] nodes, int numOfHands)
        {
            if (bitmap == null)
            {
                return;
            }
            if (nodes == null)
            {
                return;
            }

            bool needUpdate = false;
            long now;

            QueryPerformanceCounter(out now);
            if (now - last > freq)
            {
                last       = now;
                needUpdate = true;
            }

            if (Joints.Checked || Skeleton.Checked)
            {
                lock (this)
                {
                    int scaleFactor = 1;

                    Graphics g = Graphics.FromImage(bitmap);

                    using (Pen boneColor = new Pen(Color.DodgerBlue, 3.0f))
                    {
                        for (int i = 0; i < numOfHands; i++)
                        {
                            if (nodes[i][0] == null)
                            {
                                continue;
                            }
                            int baseX = (int)nodes[i][0].positionImage.x / scaleFactor;
                            int baseY = (int)nodes[i][0].positionImage.y / scaleFactor;

                            int wristX = (int)nodes[i][0].positionImage.x / scaleFactor;
                            int wristY = (int)nodes[i][0].positionImage.y / scaleFactor;

                            if (Skeleton.Checked)
                            {
                                for (int j = 1; j < 22; j++)
                                {
                                    if (nodes[i][j] == null)
                                    {
                                        continue;
                                    }
                                    int x = (int)nodes[i][j].positionImage.x / scaleFactor;
                                    int y = (int)nodes[i][j].positionImage.y / scaleFactor;

                                    if (nodes[i][j].confidence <= 0)
                                    {
                                        continue;
                                    }

                                    if (j == 2 || j == 6 || j == 10 || j == 14 || j == 18)
                                    {
                                        baseX = wristX;
                                        baseY = wristY;
                                    }

                                    g.DrawLine(boneColor, new Point(baseX, baseY), new Point(x, y));
                                    baseX = x;
                                    baseY = y;
                                }
                            }

                            if (Joints.Checked)
                            {
                                using (
                                    Pen red = new Pen(Color.Red, 3.0f),
                                    black = new Pen(Color.Black, 3.0f),
                                    green = new Pen(Color.Green, 3.0f),
                                    blue = new Pen(Color.Blue, 3.0f),
                                    cyan = new Pen(Color.Cyan, 3.0f),
                                    yellow = new Pen(Color.Yellow, 3.0f),
                                    orange = new Pen(Color.Orange, 3.0f))
                                {
                                    Pen currnetPen = black;

                                    for (int j = 0; j < HandData.NUMBER_OF_JOINTS; j++)
                                    {
                                        float sz = 4;
                                        if (Labelmap.Checked)
                                        {
                                            sz = 2;
                                        }

                                        int   x    = (int)nodes[i][j].positionImage.x / scaleFactor;
                                        int   y    = (int)nodes[i][j].positionImage.y / scaleFactor;
                                        float ledX = LED.WIDTH - ((float)LED.WIDTH / bitmap.Width) * x;
                                        float ledY = ((float)LED.HEIGHT / bitmap.Height) * y;

                                        if (nodes[i][j].confidence <= 0)
                                        {
                                            continue;
                                        }

                                        //Wrist
                                        if (j == 0)
                                        {
                                            currnetPen = black;
                                        }

                                        //Center
                                        if (j == 1)
                                        {
                                            currnetPen = red;
                                            sz        += 4;
                                        }

                                        //Thumb
                                        FixedSizedQueue <Point> target = null;
                                        if (j == 2 || j == 3 || j == 4 || j == 5)
                                        {
                                            currnetPen = green;
                                            if (j == 5)
                                            {
                                                target = this.fingerBuffer[i][0];
                                                target.Enqueue(new Point(x, y));
                                            }
                                        }
                                        //Index Finger
                                        if (j == 6 || j == 7 || j == 8 || j == 9)
                                        {
                                            currnetPen = blue;
                                            if (j == 9)
                                            {
                                                target = this.fingerBuffer[i][1];
                                                target.Enqueue(new Point(x, y));
                                            }
                                        }
                                        //Finger
                                        if (j == 10 || j == 11 || j == 12 || j == 13)
                                        {
                                            currnetPen = yellow;
                                            if (j == 13)
                                            {
                                                target = this.fingerBuffer[i][2];
                                                target.Enqueue(new Point(x, y));
                                            }
                                        }
                                        //Ring Finger
                                        if (j == 14 || j == 15 || j == 16 || j == 17)
                                        {
                                            currnetPen = cyan;
                                            if (j == 17)
                                            {
                                                target = this.fingerBuffer[i][3];
                                                target.Enqueue(new Point(x, y));
                                            }
                                        }
                                        //Pinkey
                                        if (j == 18 || j == 19 || j == 20 || j == 21)
                                        {
                                            currnetPen = orange;
                                            if (j == 21)
                                            {
                                                target = this.fingerBuffer[i][4];
                                                target.Enqueue(new Point(x, y));
                                            }
                                        }


                                        if (j == 5 || j == 9 || j == 13 || j == 17 || j == 21)
                                        {
                                            if (target != null /*&& isHandDistanceGreaterThan(target, 50)*/)
                                            {
                                                if (j == 9)
                                                {
//                                                    if (nodes[i][j].positionWorld.z < 0.4)
                                                    {
                                                        float width = 1;

                                                        if (nodes[0][9] != null && nodes[1][9] != null)
                                                        {
                                                            int   leftx      = (int)nodes[0][9].positionImage.x / scaleFactor;
                                                            int   rightx     = (int)nodes[1][9].positionImage.x / scaleFactor;
                                                            float left_ledX  = LED.WIDTH - ((float)LED.WIDTH / bitmap.Width) * leftx;
                                                            float right_ledX = LED.WIDTH - ((float)LED.WIDTH / bitmap.Width) * rightx;
                                                            width = Math.Abs(left_ledX - right_ledX);
                                                            ledX  = Math.Min(left_ledX, right_ledX) + width / 2;
                                                        }

                                                        HandsRecognition.UpdateAtField(ledX, ledY, nodes[i][j].positionWorld.z, width);
                                                        Debug.WriteLine("positionWorld x:" + nodes[i][j].positionWorld.x + " y:" + nodes[i][j].positionWorld.y + " z:" + nodes[i][j].positionWorld.z + " w:" + width);
                                                    }
                                                    //                                                    HandsRecognition.addObjectOnWave(new LED3DRipple(ledX, ledY, RGB.randamBG(), LED.Direction.Front, 3));
                                                }
                                            }

                                            if (j == 9)
                                            {
//                                                float w = 1 - nodes[i][j].positionWorld.z;
//                                                var color = new RGB(w, w, w);
//                                                HandsRecognition.addObject(new LED3DEphemeralDot(ledX, ledY, 0, color));
                                            }

                                            sz += 4;
                                        }



                                        g.DrawEllipse(currnetPen, x - sz / 2, y - sz / 2, sz, sz);
                                    }
                                }
                            }
                        }
                    }
                    g.Dispose();
                }
            }
        }