2012-03-18 42 views
1

まずは、私はMS Visual Studioを使ってKinecをプログラミングするのがとても新しくなっています...私の質問がちょっとばかげていると申し訳ありません。Kinecの画像で手と物体の接触を検出するC++

私の手が象限の上部に接触しているかどうかを検出したいと思います。そのため、私はプログラムの開発:

Image<Gray, Byte> HandImage = GetThresholdedImage(ref bgrImage, (int)hueHand); 
Image<Gray, Byte> depthImageBin = depthImage.ThresholdBinary(new Gray(30), new Gray(255)); 

List<MCvBox2D> DangerAreas = new List<MCvBox2D>(); 
List<MCvBox2D> HandAreas = new List<MCvBox2D>(); 

// build list of object rectangles 
DangerAreas = ProcessObjectContours(bgrImage, contoursDepthObjects, contoursHand, objectSize); 
// build list of hand rectangles 
HandAreas = ProcessHandContours(bgrImage, contoursHand, contoursDepthObjects, handSize);  

objectSizehandSizeオブジェクトの最小限度を定義します。

これまでのところすべてうまくいきましたが、ディスプレイ上の形が見えます。 2つの一致が合致すれば、合併する。

しかし、私の手(HandAreas)が定義された領域でオブジェクト(DangerAreas)に触れると、ソフトウェアの通知が必要になります。私はMatchShapesで問題解決しようとした

contoursDepthObjects.MatchShapes(contoursDepthObjects[0], contoursHand[0], Emgu.CV.CvEnum.MATCH_CONTOUR_TREE_METHOD.CONTOUR_TREES_MATCH_I1, 2); 

が、この形式MatchShapesでは、エラーのため、受け付けられません。したがって、2つの質問:私の手が危険領域に触れるときこれを検出する正しい方法ですか?はいの場合、方法の正しい取り扱いはどうですか?MatchShapes

+0

私はソースコードを少し「翻訳」することができました。 –

答えて

1

私がこれを行う方法は、衝突検出アルゴリズムを調べることです。 手の位置を取得して、矩形が入っているコンテナを基準にして2Dポイントに変換してから、危険領域の矩形の2Dポイントを取得することができます。次に、ハンドポイントが矩形ポイントの上(または半径)にあるかどうかを判断するだけです。 2つの点が(70の半径内)交差しているかどうかを確認するには

private static Point GetPosition2DLocation(SkeletonPoint position, Grid skeletonCanvas, DepthImageFrame depthFrame) 
     { 
      DepthImagePoint depthPoint = depthFrame.MapFromSkeletonPoint(position); 
      return new Point(
       (int)(skeletonCanvas.ActualWidth * depthPoint.X/depthFrame.Width), 
       (int)(skeletonCanvas.ActualHeight * depthPoint.Y/depthFrame.Height) 
      ); 
     } 

private static bool PointsIntersecting(Point item1, Point item2) 
     { 
      //Give the center a radius so that collision does not have to be exact. 
      //TODO configurable 
      const int radius = 70; 

      //compare the distance to combined radii 
      double dx = item2.X - item1.X; 
      double dy = item2.Y - item1.Y; 
      const int radii = radius + radius; 
      if ((dx * dx) + (dy * dy) < radii * radii) 
      { 
       return true; 
      } 
      return false; 
     } 

ホープこれが行うすべての要素がにあるグリッドに骨格の相対位置を取得する

センス。

+0

良いidearとそれは仕事をする – kersten

+0

私は助けることができてうれしい。 –

関連する問題