UpdateWriteBMP() публичный статический Метод

public static UpdateWriteBMP ( System.Windows.Media.Imaging.WriteableBitmap wbmp, Bitmap bmp ) : void
wbmp System.Windows.Media.Imaging.WriteableBitmap
bmp System.Drawing.Bitmap
Результат void
Пример #1
0
        public bool ProcessFrame()
        {
            if (CurrentFrame >= TotalFrames - 1)
            {
                return(false);
            }
            if (_CCapture != null)
            {
                var r    = _CCapture.Grab();
                var imgc = _CCapture.RetrieveBgrFrame();
                ImageConverter.UpdateWriteBMP(colorWriteBitmap, imgc.ToBitmap());
            }
            if (_DCapture != null)
            {
                var r   = _DCapture.Grab();
                var img = _DCapture.RetrieveBgrFrame();

                int framenumber = (int)_DCapture.GetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_POS_FRAMES);
                //Console.WriteLine("frame:"+framenumber.ToString());
                CurrentFrame = framenumber - 1;
                if (img == null)
                {
                    return(false);
                }
                //Show time stamp
                double time_index = _DCapture.GetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_POS_MSEC);

                PointF rightVector   = new PointF(-10, -10);
                PointF leftVector    = new PointF(10, -10);
                bool   isSkip        = false;
                bool   leftHandRaise = false;
                if (CurrentFrame >= sktList.Count || !sktList[CurrentFrame].Tracked)
                {
                    // no skeleton detected
                    headDepth = 0;
                }
                else
                {
                    headPosition = sktList[CurrentFrame][MyJointType.Head].PosDepth;
                    headDepth    = Math.Min((int)img[headPosition.Y, headPosition.X].Green, (int)img[headPosition.Y, headPosition.X].Red);
                    headDepth    = Math.Min(headDepth, (int)img[headPosition.Y, headPosition.X].Blue);
                    PointF hr  = sktList[CurrentFrame][MyJointType.HandR].PosDepth;
                    PointF hl  = sktList[CurrentFrame][MyJointType.HandL].PosDepth;
                    PointF er  = sktList[CurrentFrame][MyJointType.ElbowR].PosDepth;
                    PointF el  = sktList[CurrentFrame][MyJointType.ElbowL].PosDepth;
                    PointF hip = sktList[CurrentFrame][MyJointType.HipCenter].PosDepth;
                    // hand is lower than hip
                    //Console.WriteLine(sktList[CurrentFrame][MyJointType.HandR].Pos3D.Y);
                    //Console.WriteLine(sktList[CurrentFrame][MyJointType.ElbowR].Pos3D.Y);
                    //Console.WriteLine(sktList[CurrentFrame][MyJointType.HipCenter].Pos3D.Y);
                    //Console.WriteLine("-------------");
                    if (sktList[CurrentFrame][MyJointType.HandR].Pos3D.Y <
                        sktList[CurrentFrame][MyJointType.HipCenter].Pos3D.Y + 0.05)
                    {
                        isSkip = true;
                    }
                    if (sktList[CurrentFrame][MyJointType.HandL].Pos3D.Y >
                        -0.02f)
                    {
                        leftHandRaise = true;
                    }

                    rightVector.X = (hr.X - er.X);
                    rightVector.Y = (hr.Y - er.Y);
                    leftVector.X  = (hl.X - el.X);
                    leftVector.Y  = (hl.Y - el.Y);
                }


                #region temp

                //isSkip = false;
                //leftHandRaise = false;
                //rightVector = new PointF(-10, -10);
                //leftVector = new PointF(10, -10);
                //headDepth = (int)img[85, 315].Blue;
                #endregion
                // Console.WriteLine("headdepth:"+headDepth.ToString());

                //***********cull image*****************
                double cull     = headDepth - CullingThresh;
                var    depthImg = img.ThresholdToZeroInv(new Bgr(cull, cull, cull));
                //Image<Gray, Byte> depthImg = img.Convert<Gray, byte>().ThresholdBinary(new Gray(160), new Gray(255));
                var                sw         = Stopwatch.StartNew();
                int                handDepth  = (int)(2600.0 / 255 * cull + 400);
                HandShapeModel     handModel  = null;
                Image <Gray, Byte> rightFront = null;
                Image <Gray, Byte> leftFront  = null;
                // isskip is invalid coz no hip data
                isSkip = false;
                if (cull > 0)
                {
                    handModel = m_opencv.FindHandPart(ref depthImg, out rightFront, out leftFront, handDepth, rightVector, leftVector, leftHandRaise);
                }
                viewer.Image = depthImg;


                // no hands detected
                if (handModel == null)
                {
                    handModel = new HandShapeModel(0, HandEnum.None);
                }
                var row = new CsvRow();
                row.Add(CurrentFrame.ToString());
                row.Add(handModel.type.ToString());
                switch (handModel.type)
                {
                case HandEnum.Intersect:
                case HandEnum.Right:
                    row.Add(handModel.handPosRight.center.X.ToString());
                    row.Add(handModel.handPosRight.center.Y.ToString());
                    row.Add(handModel.handPosRight.size.Width.ToString());
                    row.Add(handModel.handPosRight.size.Height.ToString());
                    row.Add(handModel.handPosRight.angle.ToString());
                    break;

                case HandEnum.Both:
                    row.Add(handModel.handPosRight.center.X.ToString());
                    row.Add(handModel.handPosRight.center.Y.ToString());
                    row.Add(handModel.handPosRight.size.Width.ToString());
                    row.Add(handModel.handPosRight.size.Height.ToString());
                    row.Add(handModel.handPosRight.angle.ToString());
                    row.Add(handModel.handPosLeft.center.X.ToString());
                    row.Add(handModel.handPosLeft.center.Y.ToString());
                    row.Add(handModel.handPosLeft.size.Width.ToString());
                    row.Add(handModel.handPosLeft.size.Height.ToString());
                    row.Add(handModel.handPosLeft.angle.ToString());
                    break;
                }
                row.Add(cull.ToString());
                labelWriter.WriteRow(row);
                if (rightFront != null)
                {
                    ImageConverter.UpdateWriteBMP(WrtBMP_RightHandFront, rightFront.ToBitmap());
                }


                ImageConverter.UpdateWriteBMP(depthWriteBitmap, img.ToBitmap());

                if (CurrentFrame < TotalFrames - 1)
                {
                    return(true);
                }
            }
            return(false);
        }
Пример #2
0
        private void AllFrameReady(object sender, AllFramesReadyEventArgs e)
        {
            //Console.Clear();
            using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
            {
                if (skeletonFrame != null)
                {
                    skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
                    skeletonFrame.CopySkeletonDataTo(this.skeletons);
                    Skeleton skel = skeletons[0];
                    if (skel.TrackingState == SkeletonTrackingState.Tracked)
                    {
                        SkeletonPoint rightHand = skeletons[0].Joints[JointType.HandRight].Position;
                        SkeletonPoint head      = skeletons[0].Joints[JointType.Head].Position;
                        rightHandPosition = SkeletonPointToScreen(rightHand);
                        headPosition      = SkeletonPointToScreen(head);
                    }
                }
            }

            using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
            {
                if (colorFrame != null)
                {
                    // Copy the pixel data from the image to a temporary array
                    colorFrame.CopyPixelDataTo(this.colorPixels);

                    // Write the pixel data into our bitmap
                    this.ColorWriteBitmap.WritePixels(
                        new System.Windows.Int32Rect(0, 0, this.ColorWriteBitmap.PixelWidth, this.ColorWriteBitmap.PixelHeight),
                        this.colorPixels,
                        this.ColorWriteBitmap.PixelWidth * sizeof(int),
                        0);
                }
            }

            using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
            {
                if (depthFrame != null)
                {
                    var sw = Stopwatch.StartNew();
                    // Copy the pixel data from the image to a temporary array
                    depthFrame.CopyDepthImagePixelDataTo(this.depthPixels);
                    // short[] depthData = new short[depthFrame.PixelDataLength];
                    // Get the min and max reliable depth for the current frame
                    int minDepth = depthFrame.MinDepth;
                    int maxDepth = depthFrame.MaxDepth;
                    int width    = depthFrame.Width;
                    int height   = depthFrame.Height;

                    if (headPosition.X == 0)
                    {
                        headDepth = 100;
                    }
                    else
                    {
                        headDepth = depthPixels[headPosition.X + headPosition.Y * 640].Depth;
                    }

                    sw.Restart();
                    //*********** Convert cull and transform*****************
                    colorizer.TransformCullAndConvertDepthFrame(
                        depthPixels, minDepth, maxDepth, colorPixels,
                        AngleRotateTan,
                        (short)(headDepth - (short)CullingThresh), headPosition);

                    Image <Bgra, byte> depthImg;
                    //Console.WriteLine("iteration:" + sw.ElapsedMilliseconds);
                    sw.Restart();


                    Image <Gray, Byte> rightFront = null;
                    Image <Gray, Byte> leftFront  = null;
                    depthImg = ImageConverter.Array2Image(colorPixels, width, height, width * 4);
                    PointF rightVector   = PointF.Empty;
                    PointF leftVector    = PointF.Empty;
                    bool   isSkip        = false;
                    bool   leftHandRaise = false;
                    if (skeletons != null && skeletons[0].TrackingState == SkeletonTrackingState.Tracked)
                    {
                        PointF hr  = SkeletonPointToScreen(skeletons[0].Joints[JointType.HandRight].Position);
                        PointF hl  = SkeletonPointToScreen(skeletons[0].Joints[JointType.HandLeft].Position);
                        PointF er  = SkeletonPointToScreen(skeletons[0].Joints[JointType.ElbowRight].Position);
                        PointF el  = SkeletonPointToScreen(skeletons[0].Joints[JointType.ElbowLeft].Position);
                        PointF hip = SkeletonPointToScreen(skeletons[0].Joints[JointType.HipCenter].Position);
                        // hand is lower than hip
                        //Console.WriteLine(skeletons[0].Joints[JointType.HandRight].Position.Y);
                        //Console.WriteLine(skeletons[0].Joints[JointType.HipCenter].Position.Y);
                        //Console.WriteLine("-------------");
                        if (skeletons[0].Joints[JointType.HandRight].Position.Y <
                            skeletons[0].Joints[JointType.HipCenter].Position.Y + 0.05)
                        {
                            isSkip = true;
                        }
                        if (skeletons[0].Joints[JointType.HandLeft].Position.Y >
                            skeletons[0].Joints[JointType.HipCenter].Position.Y)
                        {
                            leftHandRaise = true;
                        }

                        rightVector.X = (hr.X - er.X);
                        rightVector.Y = (hr.Y - er.Y);
                        leftVector.X  = (hl.X - el.X);
                        leftVector.Y  = (hl.Y - el.Y);
                    }
                    HandShapeModel handModel = null;
                    if (!isSkip)
                    {
                        //handModel = m_OpenCVController.FindHandPart(ref depthImg, out rightFront, out leftFront, headDepth - (int)CullingThresh, rightVector, leftVector,leftHandRaise);
                    }



                    // no hands detected
                    if (handModel == null)
                    {
                        handModel = new HandShapeModel(0, HandEnum.None);
                    }
                    //sw.Restart();

                    // database processing
                    DBManager db = DBManager.GetSingleton();
                    if (db != null)
                    {
                        if (skeletons != null)
                        {
                            handModel.SetSkeletonData(skeletons[0]);
                        }
                        db.AddFrameData(handModel);
                    }
                    // not recording show prob
                    else
                    {
                        //Image<Bgr, byte>[] result = HandShapeClassifier.GetSingleton()
                        //.RecognizeGesture(handModel.hogRight, 3);
                        ////Console.WriteLine(sw.ElapsedMilliseconds);
                        //if (result != null)
                        //{
                        //    ImageConverter.UpdateWriteBMP(WrtBMP_Candidate1, result[0].Convert<Gray, byte>().ToBitmap());
                        //    ImageConverter.UpdateWriteBMP(WrtBMP_Candidate2, result[1].Convert<Gray, byte>().ToBitmap());
                        //    ImageConverter.UpdateWriteBMP(WrtBMP_Candidate3, result[2].Convert<Gray, byte>().ToBitmap());
                        //}
                    }
                    string currentSign = db == null ? "0" : db.CurrentSign.ToString();
                    string path        = @"J:\Kinect data\Aaron 141-180\hands\" + currentSign + " " + handModel.frame.ToString();
                    // UI update
                    if (rightFront != null)
                    {
                        Bitmap right = rightFront.ToBitmap();
                        //right.Save(path + " r.jpg");
                        ImageConverter.UpdateWriteBMP(WrtBMP_RightHandFront, right);
                    }
                    if (leftFront != null)
                    {
                        Bitmap left = leftFront.ToBitmap();
                        //left.Save(path + " l.jpg");
                        ImageConverter.UpdateWriteBMP(WrtBMP_LeftHandFront, left);
                    }
                    if (sw.ElapsedMilliseconds > 15)
                    {
                        Console.WriteLine("Find hand:" + sw.ElapsedMilliseconds);
                    }
                    sw.Restart();

                    //**************************draw gray histogram
                    //Bitmap histo = m_OpenCVController.Histogram(depthImg);
                    //ImageConverter.UpdateWriteBMP(GrayWriteBitmap, histo);

                    //  draw hand position from kinect
                    // DrawHandPosition(depthBMP, rightHandPosition, System.Drawing.Brushes.Purple);

                    //*******************upadte UI
                    ImageConverter.UpdateWriteBMP(DepthWriteBitmap, depthImg.ToBitmap());
                    // Console.WriteLine("Update UI:" + sw.ElapsedMilliseconds);
                }
            }
        }