My goal :
use Kinect video to do shape recognition (large rectangle on the picture), draw rectangle on the picture to highlights the results and display.
The techno I use :
- C# code,
- AForge and more specifically its shape checker
http://www.aforgenet.com/articles/shape_checker/
How the magic should work :
- Every time a frame is ready I get the frame data as bytes array and transform it to bitmap to allow me to analyze it
- Apply the shape recognition algorithm
- Render the result...
My problem :
The whole process works so far but when I try to render the result in a WPF Image it lags terribly... (1 frame every 10 sec)...
My code:
// AllFramesReady is called every time a frame is ready to use... private void AllFramesReady(object sender, AllFramesReadyEventArgs e) { using (ColorImageFrame colorFrame = e.OpenColorImageFrame()) { if (colorFrame == null) { return; } _Pixels = new byte[colorFrame.PixelDataLength]; colorFrame.CopyPixelDataTo(_Pixels); // Analyze the image int stride = colorFrame.Width * 4; System.Drawing.Size size = new System.Drawing.Size(colorFrame.Width, colorFrame.Height); // get the bitmap from bytes Bitmap btmap = BytesToBmp(_Pixels, size); //analyze the data... btmap = _shapeReco.AnalyzeImage(btmap); // copy the new data back to pixels _Pixels = BmpToBytes(btmap); // rendering the analyzed image imageAnalyzed.Source = BitmapSource.Create(colorFrame.Width, colorFrame.Height, 96, 96, PixelFormats.Bgr32, null, _Pixels, stride); } } // // HERE IS MY SHAPE RECOGNIZER THAT IMPLEMENTS THE SHAPE RECOGNITION ALGORITHM // using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using AForge; using AForge.Imaging; using AForge.Math.Geometry; namespace KinectSetupDev { class MyShapeRecognizer { private static String TAG = "MyShapeRecognizer"; /*************************************************************************** * VARIABLES * ***************************************************************************/ private SimpleShapeChecker _ShapeChecker; private Bitmap _Image; // the image to analyze private Blob[] _Blobs; private BlobCounter _BlobCounter; /*************************************************************************** * CONSTRUCTOR * ***************************************************************************/ public MyShapeRecognizer() { Debug.Log(TAG, "MyShapeRecognizer"); _ShapeChecker = new SimpleShapeChecker(); _Image = new Bitmap(300, 400); _Blobs = null; _BlobCounter = null; } /*************************************************************************** * METHODS * ***************************************************************************/ public Bitmap AnalyzeImage(Bitmap image) { Debug.Log(TAG, "AnalyzeImage"); this._Image = image; this.LocatingObjects(); this.AnalyzeObjects(); return _Image; } private void LocatingObjects() { Debug.Log(TAG, "LocatingObjects"); // lock image BitmapData bitmapData = _Image.LockBits( new Rectangle(0, 0, _Image.Width, _Image.Height), ImageLockMode.ReadOnly, _Image.PixelFormat); //locating objects _BlobCounter = new BlobCounter(); _BlobCounter.FilterBlobs = true; _BlobCounter.MinHeight = 5; _BlobCounter.MinWidth = 5; _BlobCounter.ProcessImage(bitmapData); _Blobs = _BlobCounter.GetObjectsInformation(); // unlock image _Image.UnlockBits(bitmapData); } private void AnalyzeObjects() { Debug.Log(TAG, "AnalyzeObjects"); Graphics g = Graphics.FromImage(_Image); [DRAW RECT OR CIRCLE ON GRAPHICS] g.Dispose(); } // Conver list of AForge.NET's points to array of .NET points private System.Drawing.Point[] ToPointsArray(List<IntPoint> points) { System.Drawing.Point[] array = new System.Drawing.Point[points.Count]; for (int i = 0, n = points.Count; i < n; i++) { array[i] = new System.Drawing.Point(points[i].X, points[i].Y); } return array; } } }
I can provide full code (MV C# 2010 project...). I appreciate any help!
Thanks.