Подтвердить что ты не робот

Можно ли сделать фотографию в Unity с помощью камеры устройства?

Я совершенно не знаком с более сложным набором функций Unity3D, и мне любопытно, есть ли у него возможность сделать снимок, а затем манипулировать им. В частности, мое желание состоит в том, чтобы заставить пользователя взять себя в руки, а затем проследить их вокруг лица, чтобы создать PNG, который затем будет отображаться текстурой на модель.

Я знаю, что сопоставление лица на модели прост, но мне интересно, нужно ли мне писать функцию фото/резки в приложение Chrome, или все это можно сделать из Unity. Мне не нужен учебник о том, как это сделать, просто спрашивая, возможно ли это что-то, что возможно.

4b9b3361

Ответ 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 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);
    }
}

Ответ 2

Для тех, кто пытается заставить камеру отображать живой канал, вот как мне удалось это сделать. Во-первых, я отредактировал ответ Барта, чтобы текстура была назначена на Update, а не только на Start:

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

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

Затем я привязал script к GameObject с компонентом RawImage. Вы можете легко создать его правой кнопкой мыши → UI → RawImage в иерархии в редакторе Unity (для этого требуется Unity 4.6 и выше). Запуск должен показывать прямой канал камеры на ваш взгляд. На момент написания этой статьи Unity 5 поддерживает использование веб-камер в бесплатной личной версии Unity 5.

Я надеюсь, что это поможет любому, кто ищет хороший способ захватить канал живой камеры в Unity.

Ответ 3

Это возможно. Я настоятельно рекомендую вам ознакомиться с API-интерфейсом WebcamTexture Unity. Он имеет несколько полезных функций:

  • GetPixel() - возвращает цвет пикселя в координатах (x, y).
  • GetPixels() - Получите блок пикселей.
  • GetPixels32() - возвращает данные пикселей в необработанном формате.
  • MarkNonReadable() - маркирует WebCamTexture как нечитаемый
  • Пауза() - Приостанавливает камеру.
  • Play() - Запускает камеру.
  • Стоп() - Остановка камеры.

Ответ 4

Ответ Bart имеет требуемую модификацию. Я использовал его код, и фотография, которую я получал, была черной. Необходимая модификация заключается в том, что мы должны конвертировать TakePhoto в сопрограмму и добавить

yield return new WaitForEndOfFrame(); 

в начале Coroutine. (Courtsey @fafase) Подробнее см. http://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html

Вы также можете обратиться к

Съемка с помощью веб-камеры дает черный выход [Unity3D]

Ответ 5

Существует плагин для этого типа функций под названием Camera Capture Kit - https://www.assetstore.unity3d.com/en/#!/content/56673, и при условии, что предоставленная функциональность предназначена для мобильных устройств содержит демонстрацию того, как вы можете использовать WebCamTexture для создания неподвижного изображения.

Ответ 6

Да, ты можешь. Я создал плагин Android Native camera, который может открывать камеру вашего устройства Android, захватывать изображения, записывать видео и сохранять их в нужном месте вашего устройства с помощью всего лишь нескольких строк кода.

Ответ 7

Если вы хотите сделать это без использования стороннего плагина, тогда вам поможет решение @FuntionR. Но если вы хотите сохранить захваченное фото в галерее (Android и iOS), то в рамках единства это невозможно, вам нужно написать собственный код, чтобы перенести фотографию в галерею, а затем вызвать его из единства.

Вот краткий блог, который поможет вам достичь вашей цели. http://unitydevelopers.blogspot.com/2018/07/pick-image-from-gallery-in-unity3d.html

Изменение: Обратите внимание, что вышеупомянутая тема описывает выбор изображения из галереи, но тот же процесс будет для сохранения изображения в галерее.