private void sensor_AllFramesReady(object sender, AllFramesReadyEventArgs e) { //TODO Keep the previous frame image as well, //Compare both on a background process and save it to the worksheet //Convert x&y differences to millimeters according to depth data (distance) //and some trigonometry BitmapSource depthBmp = null; blobCount = 0; using (ColorImageFrame colorFrame = e.OpenColorImageFrame()) { using (DepthImageFrame depthFrame = e.OpenDepthImageFrame()) { if (depthFrame != null) { blobCount = 0; depthBmp = depthFrame.SliceDepthImage((int)sliderMin.Value, (int)sliderMax.Value); Image <Bgr, Byte> openCVImg = new Image <Bgr, byte>(depthBmp.ToBitmap()); Image <Gray, byte> gray_image = openCVImg.Convert <Gray, byte>(); if (running) { wsheet.Cells[1, frameCount + 1].Value = "Frame " + frameCount; frameCount++; using (MemStorage stor = new MemStorage()) { //Find contours with no holes try CV_RETR_EXTERNAL to find holes Contour <System.Drawing.Point> contours = gray_image.FindContours( Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL, stor); //Conversion of depthPixels to skeletonPoints which contain all three dimensions in meters. //The conversion and copying is assumed to be costly but there are no single pixel to single point conversion I could find. depthFrame.CopyDepthImagePixelDataTo(depthPixels); //mapper.MapDepthFrameToSkeletonFrame(depthFormat, depthPixels, skeletonPoints); for (int i = 0; contours != null; contours = contours.HNext) { i++; if ((contours.Area > Math.Pow(sliderMinSize.Value, 2)) && (contours.Area < Math.Pow(sliderMaxSize.Value, 2))) { MCvBox2D box = contours.GetMinAreaRect(); //DrQ RED BOX AROUND BLOB openCVImg.Draw(box, new Bgr(System.Drawing.Color.Red), 2); blobCount++; int x = (int)box.center.X; int y = (int)box.center.Y; DepthImagePoint p = new DepthImagePoint(); p.X = x; p.Y = y; p.Depth = depthPixels[x + 640 * y].Depth; SkeletonPoint s = mapper.MapDepthPointToSkeletonPoint(depthFormat, p); //TODO Conversion from absolute coordinates to relative coordinates addCoordData(3 * blobCount - 1, frameCount, s.X, s.Y, s.Z); /*if (KinectSensor.IsKnownPoint(s)) * { * addCoordData(3 * blobCount - 1, frameCount, s.X, s.Y, s.Z); * }*/ } } } } this.outImg.Source = ImageHelpers.ToBitmapSource(openCVImg); txtBlobCount.Text = blobCount.ToString(); getNext().RunWorkerAsync(openCVImg); } } if (colorFrame != null) { colorFrame.CopyPixelDataTo(this.colorPixels); this.colorBitmap.WritePixels( new Int32Rect(0, 0, this.colorBitmap.PixelWidth, this.colorBitmap.PixelHeight), this.colorPixels, this.colorBitmap.PixelWidth * sizeof(int), 0); } } }