我正在研究一种基于手势识别的算法。我使用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--;
}
}
}
答案 0 :(得分:0)
正如评论中提到的那样(我目前无法回复)这些库总是高度依赖于system.drawing库,这些库只是一种窗口。
您可以尝试下载绘图库dll(或从系统文件夹中复制)到您的Unity项目(它的托管代码,因此它将在每个可导出的平台上运行)以保留参考。然后你可以每帧捕获一个texture2d(rendertextures左右)并将这些像素绘制到一个位图中,该位图被送到库中。
请注意,每帧复制数千个像素非常重。你必须将UnityEngine.Color转换为System.Drawing.Color ...
这是可行的简易解决方案。但绝对不是一个好的决赛。