PhotoCapture API를 사용하여 HoloLens 웹 카메라에서 사진을 촬영할 수 있습니다. PhotoCapture API를 사용하려면 WebCam 및 Microphone 성능을 활성화해야 합니다. 다음은 PhotoCapture 기능을 사용하여 사진을 촬영하고 Unity GameObject에 표시하는 방법의 예제입니다.
using UnityEngine;
using System.Collections;
using System.Linq;
using UnityEngine.VR.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
에서 이미지 데이터를 추출할 수 있습니다.
이미지 데이터에 Texture2D로 액세스합니다. Unity의 컴포넌트는 대부분 Texture2D의 이미지 데이터에 액세스하는 방법을 이해하므로 이 방법이 이미지 데이터를 추출하는 데 가장 많이 사용됩니다. 이미지가 메모리에 캡처된 후 이미지 데이터를 Texture2D로 업로드해야 합니다. 이미지 데이터가 Texture2D로 업로드된 후에는 해당 이미지 데이터를 머티리얼, 스크립트 또는 기타 프로젝트의 관련 요소에서 참조를 시작할 수 있습니다. Unity API 문서에는 사진을 메모리에 캡처한 다음 Texture2D로 업로드하는 방법의 예가 있습니다. 사진을 Texture2D에 캡처하는 방법에 대해 알아보려면 WebCam.PhotoCapture.TakePhotoAsync를 참조하십시오. 업로드 명령을 통해 이미지 데이터를 Texture2D로 업로드하는 방법은 Unity에서 이미지 데이터를 사용하여 작업하기 시작하는 가장 쉬운 방법입니다. 업로드 작업은 메인 스레드에서 수행됩니다. 이 작업은 리소스를 많이 사용하고 프로젝트의 성능에 영향을 미칠 수 있습니다.
네이티브 이미지 데이터를 WinRT IMFMediaBuffer 로 캡처합니다. 자세한 내용은 IMFMediaBuffer에 대한 Microsoft 문서를 참조하십시오. 바이트 리스트를 PhotoFrame.CopyRawImageDataIntoBuffer 함수로 전달하여 네이티브 이미지 데이터의 복사본을 만들 수 있습니다. 복사 작업은 메인 스레드에서 수행됩니다. 이 작업은 리소스를 많이 사용하고 프로젝트의 성능에 영향을 미칠 수 있습니다.
플러그인을 직접 만들거나 이미지 데이터를 별도의 스레드에서 처리하는 경우 PhotoFrame.GetUnsafePointerToBuffer 함수를 통해 네이티브 이미지 데이터를 지시하는 포인터를 얻을 수 있습니다. 반환되는 포인터는 IMFMediaBuffer COM(Component Object Model)을 지시하는 포인터입니다. 자세한 내용은 IMFMediaBuffer 및 COM(Component Object Models)에 대한 Microsoft 문서를 참조하십시오. 이 함수를 호출하면 레퍼런스가 COM 오브젝트에 추가됩니다. 리소스가 더 이상 필요하지 않으면 레퍼런스를 해제해야 합니다.