在统一3d中的每个帧上捕获图像

时间:2017-06-29 15:28:13

标签: unity3d motion

我正在研究一种基于手势识别的算法。我使用c#脚本在Winform上找到并运行此算法。我需要在我的游戏中使用相同的技术通过网络摄像头执行手势检测。我试图在我的游戏脚本中使用该算法,但无法使用该算法捕获任何图像。以下是我目前正在处理的代码。我使用aForge.net框架来实现运动检测的想法。位图图像始终返回null。然而,在winform中使用相同的算法,它会在每个帧上更改时捕获图像。我知道有一种统一使用图像捕捉的技术,但我不确定如何在运行时在每一帧上使用它。每个指导都表示赞赏。谢谢!

OpenCamera.cs

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

1 个答案:

答案 0 :(得分:0)

正如评论中提到的那样(我目前无法回复)这些库总是高度依赖于system.drawing库,这些库只是一种窗口。

您可以尝试下载绘图库dll(或从系统文件夹中复制)到您的Unity项目(它的托管代码,因此它将在每个可导出的平台上运行)以保留参考。然后你可以每帧捕获一个texture2d(rendertextures左右)并将这些像素绘制到一个位图中,该位图被送到库中。

请注意,每帧复制数千个像素非常重。你必须将UnityEngine.Color转换为System.Drawing.Color ...

这是可行的简易解决方案。但绝对不是一个好的决赛。