2017-06-29 14 views
0

私はハンドジェスチャ認識に基づいたアルゴリズムに取り組んでいます。このアルゴリズムは、Winformで見つかったC#スクリプトで実行されます。私のゲームでウェブカメラを通して手のジェスチャーの検出を行うのに必要な技術と同じ。私は自分のゲームスクリプトでアルゴリズムを使用しようとしましたが、アルゴリズムを使用してイメージをキャプチャできませんでした。以下は私が現在取り組んでいるコードです。私は、Motion.netのフレームワークを使って動き検出のアイデアを実装しています。ビットマップイメージは常にnullを返します。しかし、winformで同じアルゴリズムを使用すると、変更されたすべてのフレームでイメージがキャプチャされます。 PhotoCaptureを統一して使用するテクニックがあることは知っていますが、どのフレームでどのように実行時にそれを使用するのか分かりません。すべての指導は高く評価されます。ありがとう!イメージを1つ1つのフレームでキャプチャします。3d

OpenCamera.csこれらのライブラリは常にheavelyウィンドウの一種であるsystem.drawingライブラリに依存して(私は現時点でに返信することはできませんよ)コメントで述べたように

using AForge.GestureRecognition; 
using System.Collections; 
using System.Collections.Generic; 
using System.Drawing; 
using UnityEngine; 
using System.Drawing.Design; 
using UnityEngine.VR.WSA.WebCam; 
using System.Linq; 
using System; 

public class OpenCamera : MonoBehaviour { 

    // statistics length 
    private const int statLength = 15; 
    Bitmap image; 
    PhotoCapture photoCaptureObject = null; 
    Texture2D targetTexture = null; 
    // current statistics index 
    private int statIndex = 0; 
    // ready statistics values 
    private int statReady = 0; 
    // statistics array 
    private int[] statCount = new int[statLength]; 
    private GesturesRecognizerFromVideo gesturesRecognizer = new GesturesRecognizerFromVideo(); 
    private Gesture gesture = new Gesture(); 
    private int gestureShowTime = 0; 

    // Use this for initialization 
    void Start() 
    { 

     WebCamTexture webcamTexture = new WebCamTexture(); 
     Renderer renderer = GetComponent<Renderer>(); 
     renderer.material.mainTexture = webcamTexture; 
     webcamTexture.Play(); 

    } 




    // Update is called once per frame 
    void Update() 
    { 

     gesturesRecognizer.ProcessFrame(ref image); 

     // check if we need to draw gesture information on top of image 
     if (gestureShowTime > 0) 
     { 
      if ((gesture.LeftHand == HandPosition.NotRaised) || (gesture.RightHand != HandPosition.NotRaised)) 
      { 
       System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image); 

       string text = string.Format("Left = " + gesture.LeftHand + "\nRight = " + gesture.RightHand); 

       System.Drawing.Font drawFont = new System.Drawing.Font("Courier", 13, System.Drawing.FontStyle.Bold); 
       SolidBrush drawBrush = new SolidBrush(System.Drawing.Color.Blue); 

       g.DrawString(text, drawFont, drawBrush, new PointF(0, 5)); 

       drawFont.Dispose(); 
       drawBrush.Dispose(); 

       g.Dispose(); 
      } 
      gestureShowTime--; 
     } 
    } 
} 
+0

Unityで 'System.Drawing'を使うのは無駄です。それを使用する必要がある場合、Unityを使用することさえしないでください。これはUnityを使用する主要な理由、つまり「移植性」を取り除くためです。 Unity + OpenGLを使うことをお勧めします。 – Programmer

+0

現行のフレームワーク、すなわち、apos.netは私に手ジェスチャー認識の実際の使用を提供します。 OpenGLフレームワークを使用した場合、aForge.netのような利点がありますか? – user100020

+0

aForgeは大きく 'System.Drawing'に依存しています。 Unityを使用すると、あなたのアプリはWindows上でのみ動作するため、あなたはWPFまたはWindowsフォームを使用して使用します。私がOpenGLを言ったとき、私は実際OpenCVを意味しました。それはタイプミスでした。 C#ラッパーを作成するか、[OpenCVプラグイン](https://www.assetstore.unity3d.com/en/#!/content/21088)を購入することを検討するには、C++を知っている必要があります。時間を節約し、あらゆるタイプの画像処理を実行できます。 – Programmer

答えて

0

のみ。

あなたが試みることができるのは、図面ライブラリdll(またはシステムフォルダからのコピー)をユニティプロジェクトにダウンロードすることです(管理されたコードなので、エクスポート可能なプラットフォームごとに実行されます)。次に、フレームごとにtexture2d(レンダーテクスチャなど)をキャプチャして、それらのピクセルをライブラリに供給されるビットマップに描画できます。

1フレームごとに何千ものピクセルをコピーするのは本当に重いことに注意してください。 UnityEngine.ColorをSystem.Drawing.Colorに変換する必要があります。

これはうまくいくかもしれないイージーソリューションです。しかし、間違いなく最終的なものではありません。

関連する問題