本日はHoloLensのキャプチャに関しての調査記事です。
前回写真の撮影までの流れを調査しました。
簡単におさらいすると
①PhotoCaptureオブジェクトを作成する
②設定したいCameraParametersオブジェクトを作成します。
③StartPhotoModeAsync によるフォトモードの開始
④写真を撮る
⑤(オプション) 画像の追加の処理
⑥フォトモードを停止しリソースをクリーンアップ
という流れで撮影の処理を行っていました。
スクリプトは次のようになります。
using UnityEngine; using UnityEngine.Windows.WebCam; using System.Linq; using UnityEngine.XR; public class PhotoCapturetest: MonoBehaviour { PhotoCapture photoCaptureObject = null; void Start() { PhotoCapture.CreateAsync(false, OnPhotoCaptureCreated); } void OnPhotoCaptureCreated(PhotoCapture captureObject) { photoCaptureObject = captureObject; Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First(); CameraParameters c = new CameraParameters(); c.hologramOpacity = 0.0f; c.cameraResolutionWidth = cameraResolution.width; c.cameraResolutionHeight = cameraResolution.height; c.pixelFormat = CapturePixelFormat.BGRA32; captureObject.StartPhotoModeAsync(c,OnPhotoModeStarted); } private void OnPhotoModeStarted(PhotoCapture.PhotoCaptureResult result) { if (result.success) { string filename = string.Format(@"CapturedImage{0}_n.jpg", Time.time); string filePath = System.IO.Path.Combine(Application.persistentDataPath, filename); photoCaptureObject.TakePhotoAsync(filePath, PhotoCaptureFileOutputFormat.JPG, OnCapturedPhotoToDisk); } else { Debug.LogError("Unable to start photo mode!"); } } void OnCapturedPhotoToDisk(PhotoCapture.PhotoCaptureResult result) { if (result.success) { Debug.Log("Saved Photo to disk!"); photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode); } else { Debug.Log("Failed to save Photo to disk"); } } void OnStoppedPhotoMode(PhotoCapture.PhotoCaptureResult result) { photoCaptureObject.Dispose(); photoCaptureObject = null; } }
今回は写真をTexture2Dにします。
〇写真をテクスチャ2Dにキャプチャする
Texture2DとはUnity内で使用する画像を保存するデータの型です。
Texture2Dの方でキャプチャを行うことでその後Unityで扱える様々な処理を行えます。
〇フレームをメモリにキャプチャ
PhotoCapturetestのOnPhotoModeStarted()を次のように書き換えます。
private void OnPhotoModeStarted(PhotoCapture.PhotoCaptureResult result) { if (result.success) { photoCaptureObject.TakePhotoAsync(OnCapturedPhotoToMemory); } else { Debug.LogError("Unable to start photo mode!"); } }
フォトキャプチャー操作の結果情報を格納したデータコンテナである[PhotoCapture.PhotoCaptureResult]の操作の完了を示す[success]が真の場合
photoCaptureObject.TakePhotoAsync(OnCapturedPhotoToMemory);
で撮影を行います。
昨日の撮影して保存する場合はファイル名、保存場所などなどを設定していましたが今回はTexture2Dとして用いるためいきなり撮影を行っています。
void OnCapturedPhotoToMemory(PhotoCapture.PhotoCaptureResult result, PhotoCaptureFrame photoCaptureFrame) { if (result.success) { // Create our Texture2D for use and set the correct resolution Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First(); Texture2D targetTexture = new Texture2D(cameraResolution.width, cameraResolution.height); // Copy the raw image data into our target texture photoCaptureFrame.UploadImageDataToTexture(targetTexture); // Do as we wish with the texture such as apply it to a material, etc. } // Clean up photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode); }
targetTextureとして撮影時の解像度でTexture2Dを作成し、 photoCaptureFrame.UploadImageDataToTextureでコピーします。
PhotoCaptureFrame.UploadImageDataToTexture()はUnityで提供されている撮影した画像をテクスチャデータにコピーするメソッドです。
これでtargetTextureに画像がコピーされました。 ドキュメントではDo as we wish with the texture such as apply it to a material, etc.Materialに張り付けるなど好きに利用してください。 とあります。
この後はtargetTextureを通常のTexture2Dとして扱えるようです。
本日は以上です。