Version: 2019.2
HoloLens Web Camera
HoloLens video capture

HoloLens photo capture

Utilice la API PhotoCapture para tomar fotos desde la cámara web HoloLens. Debe habilitar las capacidades WebCam y Microphone para usar la API PhotoCapture. El siguiente ejemplo muestra cómo tomar una foto con la funcionalidad PhotoCapture y mostrarla en un GameObject de Unity.

using UnityEngine;
using System.Collections;
using System.Linq;
using UnityEngine.XR.WSA.WebCam;

public class PhotoCaptureExample : MonoBehaviour {
    PhotoCapture photoCaptureObject = null;
    Texture2D targetTexture = null;

    // Use this for initialization
    void Start() {
        Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();
        targetTexture = new Texture2D(cameraResolution.width, cameraResolution.height);

        // Create a PhotoCapture object
        PhotoCapture.CreateAsync(false, delegate (PhotoCapture captureObject) {
            photoCaptureObject = captureObject;
            CameraParameters cameraParameters = new CameraParameters();
            cameraParameters.hologramOpacity = 0.0f;
            cameraParameters.cameraResolutionWidth = cameraResolution.width;
            cameraParameters.cameraResolutionHeight = cameraResolution.height;
            cameraParameters.pixelFormat = CapturePixelFormat.BGRA32;

            // Activate the camera
            photoCaptureObject.StartPhotoModeAsync(cameraParameters, delegate (PhotoCapture.PhotoCaptureResult result) {
                // Take a picture
                photoCaptureObject.TakePhotoAsync(OnCapturedPhotoToMemory);
            });
        });
    }

    void OnCapturedPhotoToMemory(PhotoCapture.PhotoCaptureResult result, PhotoCaptureFrame photoCaptureFrame) {
        // Copy the raw image data into the target texture
        photoCaptureFrame.UploadImageDataToTexture(targetTexture);

        // Create a GameObject to which the texture can be applied
        GameObject quad = GameObject.CreatePrimitive(PrimitiveType.Quad);
        Renderer quadRenderer = quad.GetComponent<Renderer>() as Renderer;
        quadRenderer.material = new Material(Shader.Find("Custom/Unlit/UnlitTexture"));

        quad.transform.parent = this.transform;
        quad.transform.localPosition = new Vector3(0.0f, 0.0f, 3.0f);

        quadRenderer.material.SetTexture("_MainTex", targetTexture);

        // Deactivate the camera
        photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode);
    }

    void OnStoppedPhotoMode(PhotoCapture.PhotoCaptureResult result) {
        // Shutdown the photo capture resource
        photoCaptureObject.Dispose();
        photoCaptureObject = null;
    }
}

Captura una foto en la memoria

Cuando captura una imagen en la memoria, se devuelve un PhotoCaptureFrame. Un PhotoCaptureFrame contiene tanto los datos de imagen nativos como las matrices espaciales que indican dónde se tomó la imagen.

La captura de una imagen en la memoria le permite hacer referencia a la imagen capturada en un Shader, o aplicarla a un GameObject. Hay tres formas de extraer los datos de imagen del PhotoCaptureFrame. Estos son:

  1. Acceda a los datos de la imagen como un Texture2D. Esta es la forma más común de extraer datos de imágenes, porque la mayoría de los componentes de Unity comprenden cómo acceder a los datos de la imagen en Texture2D. Una vez que su imagen ha sido capturada en la memoria, debe cargar los datos de la imagen en Texture2D. Una vez que los datos de la imagen se cargan en Texture2D, puede comenzar a hacer referencia a los datos de esa imagen en materiales, scripting o cualquier otro elemento relevante de su proyecto. La documentación de Unity API tiene un ejemplo que muestra cómo capturar una foto en la memoria y luego cargarla en Texture2D. Consulte WebCam.PhotoCapture.TakePhotoAsync para aprender a capturar una foto en Texture2D. Cargar los datos de imagen a un Texture2D a través del comando de carga es la manera más fácil de comenzar a trabajar con sus datos de imagen en Unity. La operación de carga ocurre en el hilo principal. Esta operación requiere muchos recursos y puede afectar el rendimiento de su proyecto.

  2. Captura los datos de imagen nativos como WinRT IMFMediaBuffer. Consulte la documentación de Microsoft en IMFMediaBuffer para obtener más información. Haga una copia de los datos de imagen nativos pasando una lista de bytes a la función PhotoFrame.CopyRawImageDataIntoBuffer. Tenga en cuenta que la operación de copia ocurre en el hilo principal. Esta operación requiere muchos recursos y puede afectar el rendimiento de su proyecto.

  3. Si crea su propio complemento o procesa los datos de imagen en un hilo separado, puede obtener un puntero a los datos de imagen nativos a través de la función PhotoFrame.GetUnsafePointerToBuffer. El puntero devuelto es un puntero a un Modelo de Objetos Componentes (COM) de IMFMediaBuffer. Consulte la documentación de Microsoft en IMFMediaBuffer y Modelos de objetos componentes para más información. Una vez que llame a esta función, se agrega una referencia al objeto COM. Usted es responsable de liberar la referencia cuando ya no necesita el recurso.

HoloLens Web Camera
HoloLens video capture