3

私は EMGU.CV が初めてで、少し苦労しています。プロジェクトの背景を説明することから始めましょう。ユーザーの指を追跡しようとしています。つまり、ユーザーの指先を計算しようとしていますが、少し苦労しています。深度情報を特定の範囲のみにフィルター処理する一連のコードを作成し、ビットマップ イメージ tempBitmap を生成します。次に、このイメージを cvCanny で使用できる EMGU.CV を使用してグレースケール イメージに変換します。これが完了したら、キャニー イメージに膨張フィルターを適用して手の輪郭を太くし、成功した輪郭を生成する可能性を高めます。次に、手の輪郭を取得しようとします。今、私は手の周りにボックスを描くことができましたが、FindContours によって生成された輪郭を、輪郭を描くために使用できるポイントのセットに変換する方法を見つけるのに苦労しています。変数 depthImage2 は、C# フォーム ベースのアプリケーションでピクチャボックス変数に割り当てる前に描画するために使用するビットマップ イメージ変数です。あなたが私に提供できる情報やガイダンスは大歓迎です。また、私のコードが正しくない場合は、指先を計算できる方向に私を導いてくれるかもしれません。私はほとんどそこにいると思います。何かが欠けているだけなので、どんな種類の助けもいただければ幸いです。

Image<Bgr, Byte> currentFrame = new Image<Bgr, Byte>(tempBitmap);

Image<Gray, Byte> grayImage = currentFrame.Convert<Gray, Byte>().PyrDown().PyrUp();
Image<Gray, Byte> cannyImage = new Image<Gray, Byte>(grayImage.Size);
CvInvoke.cvCanny(grayImage, cannyImage, 10, 60, 3);

StructuringElementEx kernel = new StructuringElementEx(
    3, 3, 1, 1, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_ELLIPSE);

CvInvoke.cvDilate(cannyImage, cannyImage, kernel, 1);

IntPtr cont = IntPtr.Zero;

Graphics graphicsBitmap = Graphics.FromImage(depthImage2);

using (MemStorage storage = new MemStorage()) //allocate storage for contour approximation
    for (Contour<Point> contours =
        cannyImage.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,                               
            Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL); 
                contours != null; contours = contours.HNext)
    {                                
        IntPtr seq = CvInvoke.cvConvexHull2(contours, storage.Ptr, Emgu.CV.CvEnum.ORIENTATION.CV_CLOCKWISE, 0);
        IntPtr defects = CvInvoke.cvConvexityDefects(contours, seq, storage);
        Seq<Point> tr = contours.GetConvexHull(Emgu.CV.CvEnum.ORIENTATION.CV_CLOCKWISE);

        Seq<Emgu.CV.Structure.MCvConvexityDefect> te = contours.GetConvexityDefacts(
            storage, Emgu.CV.CvEnum.ORIENTATION.CV_CLOCKWISE);

        graphicsBitmap.DrawRectangle(
            new Pen(new SolidBrush(Color.Red)), tr.BoundingRectangle);
    }
4

1 に答える 1

1

輪郭の輪郭 = cannyImage.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_NONE) //すべてのポイントを返す

それから:

List<Point[]> convertedContours = new List<Point[]>();
while(cotours!=null)
{
  var contourPoints = contours.ToArray(); //put Seq<Point> to Point[], ToList() is also available ?
  convertedContours.Add(contourpoints);

  contours = contours.HNext;
}

画像描画機能のオーバーロードで輪郭を描くことができます。パラメータ Seq<> を含む署名を見つけるだけです

....

于 2014-01-16T16:04:26.480 に答える