【问题标题】:Can I take a photo in Unity using the device's camera?我可以使用设备的相机在 Unity 中拍照吗?
【发布时间】:2014-08-21 04:44:02
【问题描述】:

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

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

【问题讨论】:

  • 对于 2016 年,这里有一个完整的说明如何做到这一点...answers.unity3d.com/questions/909967/… CRITICAL...点击链接获取“魔术”代码,用于在 iOS/Android 上正确旋转、反转、旋转图像。

标签: unity3d photo


【解决方案1】:

是的,这是可能的。您将需要查看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);
    }
}

【讨论】:

  • 现在如何在安卓设备上处理相机旋转?
  • 这里究竟是什么来处理@Codejoy?你想发生什么?
  • 回复太晚了?我已经对代码进行了排序,将其附加到带有 spriteRenderer 的游戏对象上……它启动相机,如果我按下按钮会拍照但不显示实时视图……任何想法我做错了吗? (在 2D UI 环境中工作)
  • 这是在设备上随机旋转的。
  • 聚会有点晚了,但我想添加一个关于这个解决方案的重要信息。设备上的相机有两种模式 - 视频和照片。当您显示预览时,相机处于视频模式,在大多数情况下会提供低于标准的质量。与使用同一设备拍摄的普通照片相比,从该输入创建静态照片会导致照片质量非常差。
【解决方案2】:

对于那些试图让相机实时渲染的人来说,这是我成功实现的方法。首先,我编辑了 Bart 的答案,因此纹理将在更新时分配,而不仅仅是在开始时:

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

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

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

我希望这可以帮助任何寻找在 Unity 中捕捉实时摄像头馈送的好方法的人。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      Bart 的回答有一个必要的修改。我使用了他的代码,我得到的图片是黑色的。需要修改的是我们必须 将 TakePhoto 转换为协程并添加

      yield return new WaitForEndOfFrame(); 
      

      在协程的开始。 (礼貌@fafase) 有关更多详细信息,请参阅 http://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html

      也可以参考

      Take photo using webcam is giving black output[Unity3D]

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          有一个插件可用于这种类型的功能,称为 Camera Capture Kit - https://www.assetstore.unity3d.com/en/#!/content/56673,虽然提供的功能面向移动设备,但它包含一个演示如何使用 WebCamTexture 拍摄静止图像。

          【讨论】:

            【解决方案7】:

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-02-20
              • 1970-01-01
              • 1970-01-01
              • 2011-06-08
              • 2021-08-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多