在Unity中显示实时摄像头源

时间:2013-10-20 20:28:27

标签: c# unity3d unityscript

我对Unity有疑问。我希望以前没有回答过这个问题。 我想将相机(如高清摄像头)连接到我的电脑,视频输入应显示在Unity场景中。可以把它想象成一个虚拟电视屏幕,它可以实时显示相机所看到的内容。我怎样才能做到这一点?谷歌没有指出我正确的方向,但也许我只是无法正确查询;)

我希望你明白我的目标。

4 个答案:

答案 0 :(得分:15)

是的,这当然是可能的,幸运的是Unity3D实际上支持它开箱即用。您可以使用WebCamTexture查找网络摄像头并将其渲染为纹理。从那里你可以选择在3D场景中的任何东西上渲染纹理,当然包括你的虚拟电视屏幕。

它看起来很自我解释,但下面的代码应该让你开始。

列出并打印出它检测到的已连接设备:

var devices : WebCamDevice[] = WebCamTexture.devices;
for( var i = 0 ; i < devices.length ; i++ )
    Debug.Log(devices[i].name);

连接到连接的网络摄像头并将图像数据发送到纹理:

WebCamTexture webcam = WebCamTexture("NameOfDevice");
renderer.material.mainTexture = webcam;
webcam.Play();

答案 1 :(得分:2)

如果它有帮助,我会根据上面接受的答案发布一个答案,写成一个C#脚本(接受的答案是在JavaScript中)。只需将此脚本附加到附加了渲染器的GameObject,它应该可以工作。

public class DisplayWebCam : MonoBehaviour
{
    void Start ()
    {
        WebCamDevice[] devices = WebCamTexture.devices;

        // for debugging purposes, prints available devices to the console
        for(int i = 0; i < devices.Length; i++)
        {
            print("Webcam available: " + devices[i].name);
        }

        Renderer rend = this.GetComponentInChildren<Renderer>();

        // assuming the first available WebCam is desired
        WebCamTexture tex = new WebCamTexture(devices[0].name);
        rend.material.mainTexture = tex;
        tex.Play();
    }
}

答案 2 :(得分:1)

以@LeeStemKoski的示例为例,我制作了一个示例,该示例使用原始图像播放网络摄像头纹理,以便您可以将网络摄像头添加到UI。

public class DisplayWebCam : MonoBehaviour
{
    [SerializeField]
    private UnityEngine.UI.RawImage _rawImage;

    void Start()
    {
        WebCamDevice[] devices = WebCamTexture.devices;

        // for debugging purposes, prints available devices to the console
        for (int i = 0; i < devices.Length; i++)
        {
            print("Webcam available: " + devices[i].name);
        }

        //Renderer rend = this.GetComponentInChildren<Renderer>();

        // assuming the first available WebCam is desired

        WebCamTexture tex = new WebCamTexture(devices[0].name);
        //rend.material.mainTexture = tex;
        this._rawImage.texture = tex;
        tex.Play();
    }
}

**编辑**

这很容易解释,但以防万一:将此脚本附加到您的GameObject之一上,您会看到gui information panel上显示“ Raw Image”表单字段GameObject,您可以将UI RawImage GameObject拖放到表单字段中。

答案 3 :(得分:0)

我不得不修改@Jachsonkr的原始图像代码以使其对我有用:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class DisplayWebCam : MonoBehaviour
{
  [SerializeField]
  private UnityEngine.UI.RawImage _rawImage;

  void Start()
  {
      WebCamDevice[] devices = WebCamTexture.devices;

      // for debugging purposes, prints available devices to the console
      for (int i = 0; i < devices.Length; i++)
      {
          print("Webcam available: " + devices[i].name);
      }

      WebCamTexture tex = new WebCamTexture(devices[0].name);

      RawImage m_RawImage;
      m_RawImage = GetComponent<RawImage>();
      m_RawImage.texture = tex;
      tex.Play();
  }
}

我已经添加了原始图像(总是添加到面板中)。然后只需通过拖放将该代码添加到原始图像中,即可显示网络摄像头。