我可以使用设备的相机在Unity中拍照吗?

时间:2014-06-30 18:18:29

标签: unity3d photo

我完全不熟悉Unity3D更复杂的功能集,如果它有能力拍照然后操作它,我很好奇。具体来说,我的愿望是让用户自拍,然后让他们在他们的脸上追踪以创建一个PNG,然后将纹理映射到模型上。

我知道将面部映射到模型上很简单,但我想知道是否需要将照片/雕刻功能写入包含在内的Chrome应用程序中,或者是否可以在Unity内完成。我不需要有关如何操作的教程,只是询问它是否可能。

7 个答案:

答案 0 :(得分:21)

是的,这是可能的。您需要查看WebCamTexture功能。

您创建一个WebCamTexture并调用其启动摄像头的Play()功能。 WebCamTexture与任何纹理一样,允许您通过GetPixels()调用获取像素。这允许您在需要时拍摄快照,并且可以将其保存在Texture2D中。调用EncodeToPNG()并随后写入文件应该可以帮助您。

请注意,以下代码是基于文档的快速编写。我没有测试过。如果有多个可用设备,则可能必须选择正确的设备。

using UnityEngine;
using System.Collections;
using System.IO;

public class WebCamPhotoCamera : MonoBehaviour 
{
    WebCamTexture webCamTexture;

    void Start() 
    {
        webCamTexture = new WebCamTexture();
        GetComponent<Renderer>().material.mainTexture = webCamTexture; //Add Mesh Renderer to the GameObject to which this script is attached to
        webCamTexture.Play();
    }

    IEnumerator TakePhoto()  // Start this Coroutine on some button click
    {

    // NOTE - you almost certainly have to do this here:

     yield return new WaitForEndOfFrame(); 

    // it's a rare case where the Unity doco is pretty clear,
    // http://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html
    // be sure to scroll down to the SECOND long example on that doco page 

        Texture2D photo = new Texture2D(webCamTexture.width, webCamTexture.height);
        photo.SetPixels(webCamTexture.GetPixels());
        photo.Apply();

        //Encode to a PNG
        byte[] bytes = photo.EncodeToPNG();
        //Write out the PNG. Of course you have to substitute your_path for something sensible
        File.WriteAllBytes(your_path + "photo.png", bytes);
    }
}

答案 1 :(得分:7)

对于那些试图让相机渲染实时反馈的人来说,这就是我设法将其拉下来的方式。首先,我编辑了Bart的答案,因此纹理将在Update上分配,而不仅仅是在Start:

void Start()
{
    webCamTexture = new WebCamTexture();
    webCamTexture.Play();
}

void Update()
{
    GetComponent<RawImage>().texture = webCamTexture;
}

然后我将脚本附加到带有RawImage组件的GameObject。您可以通过右键单击轻松创建一个 - &gt; UI - &gt; Unity Editor中层次结构中的RawImage(这需要Unity 4.6及更高版本)。运行它应该在您的视图中显示相机的实时馈送。在撰写本文时,Unity 5支持在Unity 5的免费个人版中使用网络摄像头。

我希望这有助于任何寻找在Unity中捕获实时相机Feed的好方法的人。

答案 2 :(得分:5)

有可能。我强烈建议您查看WebcamTexture Unity API。它有一些有用的功能:

  1. GetPixel() - 返回坐标(x,y)处的像素颜色。
  2. GetPixels() - 获取像素颜色块。
  3. GetPixels32() - 以原始格式返回像素数据。
  4. MarkNonReadable() - 将WebCamTexture标记为不可读
  5. Pause() - 暂停相机。
  6. Play() - 启动相机。
  7. Stop() - 停止相机。

答案 3 :(得分:4)

巴特的回答有必要的修改。我用他的代码和我得到的图片是黑色的。必要的修改是我们必须的 将TakePhoto转换为协程并添加

yield return new WaitForEndOfFrame(); 
在Coroutine开始时。 (Courtsey @fafase) 有关详细信息,请参阅 http://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html

您也可以参考

Take photo using webcam is giving black output[Unity3D]

答案 4 :(得分:0)

此类功能可以使用一个名为Camera Capture Kit的插件 - https://www.assetstore.unity3d.com/en/#!/content/56673,虽然提供的功能适用于移动设备,但它包含了如何使用WebCamTexture拍摄静止图像的演示。< / p>

答案 5 :(得分:0)

是的,可以。我创建了Android Native camera插件,可以打开Android设备的摄像头,捕获图像,录制视频并将其保存到设备的所需位置,只需几行代码。

答案 6 :(得分:0)

如果您不想使用第三方插件就可以这样做,那么@FuntionR解决方案将为您提供帮助。但是,如果要将捕获的照片保存到图库(Android和iOS)中,则不可能统一使用,必须编写本机代码才能将照片传输到图库,然后从统一位置调用它。

这是一个摘要博客,它将指导您实现目标。 http://unitydevelopers.blogspot.com/2018/07/pick-image-from-gallery-in-unity3d.html

编辑:请注意,以上线程描述了从图库中拾取图像,但是将图像保存到图库的过程相同。