2012-08-28 7 views
7

こんにちは私はいくつかの画像処理をしようとしています。私はMicrosoft Kinectを使用して、部屋の人間を検出します。私は、深度データを取得し、いくつかのバックグラウンド除去作業を行うと、人がシーンに入ると周りに歩くときに、このようなビデオシーケンスで終わる:このビデオシーケンスからノイズを除去するにはどうすればよいですか?

http://www.screenr.com/h7f8

あなたはの動作を確認できるように、私はビデオを置きますビデオのノイズ。異なる色は、異なるレベルの深度を表します。白は空を表します。あなたが見ることができるように、それはかなり騒々しい、特に赤い騒音です。

できるだけ人間以外のすべてを取り除く必要があります。私が侵食/膨張(非常に大きなウィンドウサイズを使用)をするとき、私は多くの騒音を取り除くことができますが、私が使用できる他の方法があるかどうか疑問に思いました。特に、ビデオの赤いノイズは、侵食/膨張を使用して除去するのが難しいです。

いくつかの注意:私たちは何も人間がシーンに存在しないとき知っていれば

1)は、より良いバックグラウンド減算を行うことができるが、私たちは、バックグラウンド減算が完全に自動化され、それは人間が中にある場合でも動作しますシーンや、カメラが動かされたときなどにも、これが最良のバックグラウンド・サブトラクションです。今すぐ取得できます。

2)アルゴリズムはリアルタイムで組み込みシステムで動作します。したがって、より効率的で簡単なアルゴリズムほど良いでしょう。そして完璧である必要はありません。複雑な信号処理技術も歓迎しますが(組み込みのリアルタイム処理が不要な別のプロジェクトで使用するかもしれません)。

3)実際のコードは必要ありません。ちょうどアイデア。

+0

バックグラウンドの減算についてもっと知っていると分かります。つまり、イメージにノイズが残っているのはなぜですか? – jpa

+0

どのSDK /ドライバ(MS Kinect SDK、OpenNI、libfreenectなど)を使用していますか? –

答えて

0

これは、Kinect SDKを使用していると仮定するとかなり簡単です。私は、深さの基礎のためのthisビデオに従っており、このようなものだろう:

private byte[] GenerateColoredBytes(DepthImageFrame depthFrame) 
    { 

     //get the raw data from kinect with the depth for every pixel 
     short[] rawDepthData = new short[depthFrame.PixelDataLength]; 
     depthFrame.CopyPixelDataTo(rawDepthData); 

     //use depthFrame to create the image to display on-screen 
     //depthFrame contains color information for all pixels in image 
     //Height x Width x 4 (Red, Green, Blue, empty byte) 
     Byte[] pixels = new byte[depthFrame.Height * depthFrame.Width * 4]; 

     //Bgr32 - Blue, Green, Red, empty byte 
     //Bgra32 - Blue, Green, Red, transparency 
     //You must set transparency for Bgra as .NET defaults a byte to 0 = fully transparent 

     //hardcoded locations to Blue, Green, Red (BGR) index positions  
     const int BlueIndex = 0; 
     const int GreenIndex = 1; 
     const int RedIndex = 2; 


     //loop through all distances 
     //pick a RGB color based on distance 
     for (int depthIndex = 0, colorIndex = 0; 
      depthIndex < rawDepthData.Length && colorIndex < pixels.Length; 
      depthIndex++, colorIndex += 4) 
     { 
      //get the player (requires skeleton tracking enabled for values) 
      int player = rawDepthData[depthIndex] & DepthImageFrame.PlayerIndexBitmask; 

      //gets the depth value 
      int depth = rawDepthData[depthIndex] >> DepthImageFrame.PlayerIndexBitmaskWidth; 

      //.9M or 2.95' 
      if (depth <= 900) 
      { 
       //we are very close 
       pixels[colorIndex + BlueIndex] = Colors.White.B; 
       pixels[colorIndex + GreenIndex] = Colors.White.G; 
       pixels[colorIndex + RedIndex] = Colors.White.R; 
      } 
      // .9M - 2M or 2.95' - 6.56' 
      else if (depth > 900 && depth < 2000) 
      { 
       //we are a bit further away 
       pixels[colorIndex + BlueIndex] = Colors.White.B; 
       pixels[colorIndex + GreenIndex] = Colors.White.G; 
       pixels[colorIndex + RedIndex] = Colors.White.R; 
      } 
      // 2M+ or 6.56'+ 
      else if (depth > 2000) 
      { 
       //we are the farthest 
       pixels[colorIndex + BlueIndex] = Colors.White.B; 
       pixels[colorIndex + GreenIndex] = Colors.White.G; 
       pixels[colorIndex + RedIndex] = Colors.White.R; 
      } 


      ////equal coloring for monochromatic histogram 
      //byte intensity = CalculateIntensityFromDepth(depth); 
      //pixels[colorIndex + BlueIndex] = intensity; 
      //pixels[colorIndex + GreenIndex] = intensity; 
      //pixels[colorIndex + RedIndex] = intensity; 


      //Color all players "gold" 
      if (player > 0) 
      { 
       pixels[colorIndex + BlueIndex] = Colors.Gold.B; 
       pixels[colorIndex + GreenIndex] = Colors.Gold.G; 
       pixels[colorIndex + RedIndex] = Colors.Gold.R; 
      } 

     } 


     return pixels; 
    } 

これは、白人間以外のすべてをオンにし、人間は金です。お役に立てれば!

EDIT

私はあなたが必ずしもコードだけのアイデアをしたくなかったので、私は深さを発見するアルゴリズム、および人間の量を見つけ1、および除く白色のすべてを見つけると言うだろう知っています人間。私はこれをすべて提供しましたが、何が起こっているかを知っているかどうかは分かりませんでした。また、私は最終的なプログラムのイメージを持っています。

image1

注:私は私が間違っている可能性があります(私はそのために処理せずにビデオを必要とするだろう)が、私はあなたのことを言う傾向があると思い視点

0

のための第2の深さフレームを追加しました照明の変化を取り除こうとしています。

これは、実際の環境では人の検出を非常に困難にしています。

いくつかのリンクについては、this other SO questionをチェックアウトすることができます。

私は、あなたと同じ構成で、しかし単眼視力で、人間をリアルタイムで検出することができました。 私の場合、本当に良い記述子はLBPsで、主にテクスチャ分類に使用されています。 これは実践するのが非常に簡単です(Web上に実装されています)。

LBPは基本的に動きが検出される関心領域を定義するために使用されるため、画像の一部だけを処理してそのノイズをすべて取り除くことができます。

この例では、画像のグレースケール補正にLBPを使用しています。

希望は新しいアイデアをもたらします。

2

ちょうど私の2セント:あなたはそのためのSDKを使用して気にしない場合は

、あなたは非常に簡単にアウトローキツネザルが示すようにPlayerIndexBitmaskを使用している唯一の人物ピクセルを維持することができます。

これでドライバに依存したくない場合や、画像処理レベルでそれを実行したい場合があります。私たちがプロジェクトで試みたアプローチは、輪郭に基づいたものでした。我々はバックグラウンド・サブトラクションから始めて、これが人物であると仮定して画像内の最大の輪郭を検出しました(通常、残ったノイズは非常に小さなブロブであったため)。最初のパスとして何らかのメディアンフィルタリングを使用することもできます。

もちろん、これはすべての場合に完璧でも適切でもありません。おそらくもっと良い方法があります。しかし、私はちょうどそれをあなたが任意のアイデアを考え出すのに役立つ場合は、それを投げている。

+0

+1これは任意の言語/ソースに適用できます –

1

eyeswebをご覧ください。

これはkinectデバイスをサポートする設計のプラットフォームであり、出力にノイズフィルタを適用することができます。これは、システム設計のための非常に便利でシンプルなツールです。

関連する問題