2012-04-26 20 views
3

私の目的:形状認識(画像上に大きな四角形)を行うには、Kinectビデオを使用し、結果をハイライト表示して表示するために矩形を描きます。AFinを使用したKinectビデオのC#画像処理

私が使用テクノ:

  • C#のコードは、
  • AForge、より具体的にその形状チェッカー魔法がどのように動作するかを

http://www.aforgenet.com/articles/shape_checker/


  1. フレームが、私はバイト配列としてフレームデータを取得し、許可するようにビットマップにそれを変換する準備ができているたびに、私は結果をレンダリング
  2. は、形状認識アルゴリズム
  3. を適用し、それを分析する...

私の問題:
全体のプロセスは、これまでに動作しますが、私はそれがひどく遅れWPFイメージで結果をレンダリングしようとすると...(1つのフレームごとに10秒)...

マイコード:

// 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; 
    } 

    } 
} 

が、私は(... MV C#2010プロジェクト)完全なコードを提供することができます。私は助けていただきありがとうございます!

ありがとうございました。

+0

あなたはそこにひどくやっています。どの回線が最も時間を費やしているかを調べるためにプロファイリングしましたか? – Ani

+0

以下のような画像処理に関連する行:_BlobCounter.ProcessImage(bitmapData); _Blobs = _BlobCounter.GetObjectsInformation(); ....しかし、私は問題を解決します。私は単に画像処理1を3フレーム以上と呼んでいます。これは必要なもの(10fps)で十分で、メインディスプレイはもはや遅れません。 :) –

+0

巨大な領域をコメントアウトする代わりに、 '#region Example Region'を使用して、コード'#endregion'の最後に、最終結果は[this:http://i.imgur。 com/LS18m。png) –

答えて

0

Hmmm、上記のコメントから、AForgeコードが物事をゆっくりと実行しているようです。私は考えることができるものから、次のオプション

  1. を持って(再)
  2. まで物事を高速化するためにOpenCL(CPUやGPU上)を使用するブロブ処理を記述EmguCVなどの高速化、画像処理ライブラリを使用しますか?さらに多くの可能性があります
  3. リアルタイム処理が不要な場合は、入力フレームをバッファリングし、複数のバックグラウンドスレッドでAForge.NETができるだけ高速に処理してできるだけ多くの遅延を吸収します。

おそらくさらに私はここで行方不明になっています。しかし、これらはあなたを正しい道に導くはずです。

+0

私はオプション4に行きました:もし画像処理が遅すぎるなら...処理してフレームをスキップしないでください。私のストリームは30fpsで、20fpsで処理しています。ありがとう。 –

関連する問題