Version: 2017.4
HoloLens 웹 카메라
HoloLens 비디오 캡처

HoloLens 포토 캡처

PhotoCapture API를 사용하여 HoloLens 웹 카메라에서 사진을 촬영할 수 있습니다. PhotoCapture API를 사용하려면 WebCamMicrophone 기능을 활성화해야 합니다. 다음은 PhotoCapture 기능을 사용하여 사진을 촬영하고 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;
    }
}

메모리에 사진 캡처

이미지를 메모리에 캡처하면 PhotoCaptureFrame이 반환됩니다. PhotoCaptureFrame에는 네이티브 이미지 데이터와 이미지가 촬영된 위치를 나타내는 공간 메트릭스가 모두 포함됩니다.

이미지를 메모리에 캡처하면 캡처된 이미지를 셰이더에서 참조하거나 게임 오브젝트에 적용할 수 있습니다. 다음 세 가지 방법으로 PhotoCaptureFrame에서 이미지 데이터를 추출할 수 있습니다.

  1. 이미지 데이터에 Texture2D로 액세스합니다. Unity 에디터의 컴포넌트는 대부분 Texture2D의 이미지 데이터에 액세스하는 방법을 이해하므로 이 방법이 이미지 데이터를 추출하는 데 가장 많이 사용됩니다. 이미지가 메모리에 캡처된 후에는 이미지 데이터를 Texture2D로 업로드해야 합니다. 이미지 데이터가 Texture2D로 업로드된 후에는 머티리얼, 스크립트, 기타 프로젝트의 관련 요소에서 해당 이미지 데이터를 참조할 수 있습니다. Unity API 문서에는 사진을 메모리에 캡처한 다음 Texture2D로 업로드하는 방법을 보여주는 예제가 있습니다. 사진을 Texture2D에 캡처하는 방법에 대해 알아보려면 WebCam.PhotoCapture.TakePhotoAsync를 참조하십시오. 업로드 커맨드를 통해 이미지 데이터를 Texture2D로 업로드하면 Unity 에디터에서 이미지 데이터를 사용하여 가장 편리하게 작업을 시작할 수 있습니다. 업로드 작업은 메인 스레드에서 수행됩니다. 이 작업은 리소스를 많이 사용하고 프로젝트의 성능에 영향을 미칠 수 있습니다.

  2. 네이티브 이미지 데이터를 WinRT IMFMediaBuffer 로 캡처합니다. 자세한 내용은 Microsoft가 제공하는 IMFMediaBuffer 문서를 참조하십시오. 바이트 목록을 PhotoFrame.CopyRawImageDataIntoBuffer 함수에 전달하여 네이티브 이미지 데이터의 복사본을 만들 수 있습니다. 복사 작업은 메인 스레드에서 수행됩니다. 이 작업은 리소스를 많이 사용하고 프로젝트의 성능에 영향을 미칠 수 있습니다.

  3. 플러그인을 직접 만들거나 이미지 데이터를 별도의 스레드에서 처리하는 경우 PhotoFrame.GetUnsafePointerToBuffer 함수를 통해 네이티브 이미지 데이터를 지시하는 포인터를 얻을 수 있습니다. 반환되는 포인터는 IMFMediaBuffer COM(Component Object Model)을 지시하는 포인터입니다. 자세한 내용은 Microsoft가 제공하는 IMFMediaBufferComponent Object Models 문서를 참조하십시오. 이 함수를 호출하면 레퍼런스가 COM 오브젝트에 추가됩니다. 리소스가 더 이상 필요하지 않으면 레퍼런스를 직접 해제해야 합니다.

HoloLens 웹 카메라
HoloLens 비디오 캡처