Hololens使用相机功能

原文链接:https://www.cnblogs.com/mantgh/p/5667385.html

Enabling the capability for Photo Video Camera 启用相机能力


 

为了使用摄像头,我们必须启用WebCam能力。

  1. 在Unity中打开Player settings
  2. 展开Windows Store标签页
  3. 在"Publishing Settings > Capabilities"部分勾选WebCam能力

 

同一时刻只能执行一次相机操作。为了识别当前相机处在哪种模式下(拍照还是视频),你可以通过UnityEngine.VR.WSA.WebCam.Mode API检查。

 

Photo Capture 捕获照片


 

命名空间UnityEngine.VR.WSA.WebCam

类型PhotoCapture

 

PhotoCapture类允许我们使用相机拍摄静态照片。正常的使用模式如下:

  1. 创建PhotoCapture对象
  2. 使用我们想要的设置来创建一个CameraParameters对象
  3. 调用StartPhotoModeAsync()方法开始拍照模式
  4. 拍摄想要的照片
    • (可选项)进一步处理捕获的图像
  5. 关闭拍照模式并释放资源

Common Set Up for PhotoCapture 使用PhotoCapture的通用做法

对于任何拍照方式,开始步骤都是像下面这样:

 

创建PhotoCapture对象

 

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, false, OnPhotoModeStarted);
   }
复制代码

 

最后关闭相机时需要使用同样的清理代码

 

void OnStoppedPhotoMode(PhotoCapture.PhotoCaptureResult result)
   {
       photoCaptureObject.Dispose();
       photoCaptureObject = null;
   }

 

完成这些步骤后,你可以挑选使用哪种方式捕获照片。

 

Capture a Photo to a File 捕获照片到文件

 

最简单的做法是直接将照片捕获到文件。照片可以被存储为PNG或JPG文件。

如果我们成功开始了拍照模式,需要拍照并将照片存储到磁盘上,做法如下:

 

复制代码
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");
       }
   
复制代码

 

Capture a Photo to a Texture2D 捕获文件到Texture2D对象

 

我们可以把捕获的照片保存为Texture2D对象,做法和保存到文件类似。步骤如下:

在OnPhotoModeStarted()方法中,捕获一帧图像到内存中。

 

复制代码
private void OnPhotoModeStarted(PhotoCapture.PhotoCaptureResult result)
   {
       if (result.success)
       {
           photoCaptureObject.TakePhotoAsync(OnCapturedPhotoToMemory);
       }
       else
       {
           Debug.LogError("Unable to start photo mode!");
       }
   }
复制代码

 

我们需要把得到的结果赋给Texture2D对象,然后清理相机资源

 

复制代码
void OnCapturedPhotoToMemory(PhotoCapture.PhotoCaptureResult result, PhotoCaptureFrame photoCaptureFrame)
   {
       if (result.success)
       {
           // 使用正确分辨率创建Texture2D对象
           Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();
           Texture2D targetTexture = new Texture2D(cameraResolution.width, cameraResolution.height);
           // 将图像数据拷贝到Texture2D对象中
           photoCaptureFrame.UploadImageDataToTexture(targetTexture);
           // 进一步使用Texture2D对象,比如赋给材质神马的
       }
       // 清理相机
       photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode);
   }
复制代码

 

Capture a Photo and Interact with the Raw bytes 捕获照片并和原始数据交互

为了在内存中操作图像原始数据,需要的步骤和捕获图片到Texture2D类似,不同之处在于,OnCapturedPhotoToMemory()方法里可以获得图像原始数据并操作它们。

在本示例中,我们会创建一个List<Color>用来进一步处理或者直接通过SetPixels()方法来应用于Texture2D对象。

 

复制代码
void OnCapturedPhotoToMemory(PhotoCapture.PhotoCaptureResult result, PhotoCaptureFrame photoCaptureFrame)
   {
       if (result.success)
       {
           List<byte> imageBufferList = new List<byte>();
           // 复制原始 IMFMediaBuffer 数据到空的list
           photoCaptureFrame.CopyRawImageDataIntoBuffer(imageBufferList);

           //本例使用 BGRA32 格式捕获照片.
           int stride = 4;
           float denominator = 1.0f / 255.0f;
           List<Color> colorArray = new List<Color>();
           for (int i = imageBufferList.Count - 1; i >= 0; i -= stride)
           {
               float a = (int)(imageBufferList[i - 0]) * denominator;
               float r = (int)(imageBufferList[i - 1]) * denominator;
               float g = (int)(imageBufferList[i - 2]) * denominator;
               float b = (int)(imageBufferList[i - 3]) * denominator;

               colorArray.Add(new Color(r, g, b, a));
           }
           // 接下来可以把list用做进一步的处理

       }
       photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode);
   }
复制代码

 

Video Capture 捕获视频


 

命名空间UnityEngine.VR.WSA.WebCam

类型VideoCapture

捕获视频的用法和捕获照片类似,不同的地方在于你必须指定一个帧率(FPS)并且你只能以MP4格式把视频直接存储到磁盘上。步骤如下:

  1. 创建VideoCapture对象
  2. 使用我们想要的设置来创建一个CameraParameters对象
  3. 调用 StartVideoModeAsync()方法开始视频捕获模式
  4. 开始录制视频
  5. 停止录制视频
  6. 停止视频捕获模式并释放相机资源

创建并配置VideoCapture对象

 

复制代码
void Start ()
   {
       VideoCapture.CreateAsync(false, OnVideoCaptureCreated);
   }

void OnVideoCaptureCreated (VideoCapture videoCapture)
   {
       if (videoCapture != null)
       {
           m_VideoCapture = videoCapture;

           Resolution cameraResolution = VideoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();
           float cameraFramerate = VideoCapture.GetSupportedFrameRatesForResolution(cameraResolution).OrderByDescending((fps) => fps).First();

           CameraParameters cameraParameters = new CameraParameters();
           cameraParameters.hologramOpacity = 0.0f;
           cameraParameters.frameRate = cameraFramerate;
           cameraParameters.cameraResolutionWidth = cameraResolution.width;
           cameraParameters.cameraResolutionHeight = cameraResolution.height;
           cameraParameters.pixelFormat = CapturePixelFormat.BGRA32;

           m_VideoCapture.StartVideoModeAsync(cameraParameters,
                                               VideoCapture.AudioState.None,
                                               OnStartedVideoCaptureMode);
       }
       else
       {
           Debug.LogError("Failed to create VideoCapture Instance!");
       }
   }
复制代码

 

一旦配置完成VideoCapture对象,我们就开始录制视频

 

复制代码
void OnStartedVideoCaptureMode(VideoCapture.VideoCaptureResult result)
   {
       if (result.success)
       {
           string filename = string.Format("MyVideo_{0}.mp4", Time.time);
           string filepath = System.IO.Path.Combine(Application.persistentDataPath, filename);

           m_VideoCapture.StartRecordingAsync(filepath, OnStartedRecordingVideo);
       }
   }
复制代码

 

在开始录制后,我们需要更新UI或者行为来确保可以停止视频捕获。在这里我们只输出log。

 

void OnStartedRecordingVideo(VideoCapture.VideoCaptureResult result)
   {
       Debug.Log("Started Recording Video!");
       // 我们将会通过一些方式来停止视频捕获,比如计时器或者点击手势等等
   }

 

最后我们需要停止视频捕获,可以中国定时器或者其他输入方式来实现。

 

   void StopRecordingVideo()
   {
       m_VideoCapture.StopRecordingAsync(OnStoppedRecordingVideo);
   }

 

一旦视频捕获停止后,需要及时退出视频捕获模式并释放相机资源。

 

复制代码
void OnStoppedRecordingVideo(VideoCapture.VideoCaptureResult result)
   {
       Debug.Log("Stopped Recording Video!");
       m_VideoCapture.StopVideoModeAsync(OnStoppedVideoCaptureMode);
   }

   void OnStoppedVideoCaptureMode(VideoCapture.VideoCaptureResult result)
   {
       m_VideoCapture.Dispose();
       m_VideoCapture = null;
   }
复制代码

 

Troubleshooting 问题诊断


  • 获取不到分辨率

    • 确保你在项目中启用了WebCam能力
  • 全息图像不能捕获到图片或者视频中
    • 未来的更新会支持捕获全息图像
### 回答1: Unity和Hololens2是两个不同的技术,但可以结合使用。Unity是一个跨平台的游戏引擎和开发工具,可以用来创建虚拟现实(VR)和增强现实(AR)应用程序。而Hololens2是微软推出的一款AR智能眼镜设备,能够将虚拟内容与现实世界进行融合显示。 而"深度相机"是Hololens2上的一个重要部件,用于感知和捕捉周围环境的深度信息。它通过红外光源和红外相机的组合,实现对场景中物体的深度感知和距离测量。这些深度信息可以用来进行空间定位、虚拟物体与真实物体的交互、手势识别等功能。 Unity提供了与Hololens2深度相机集成的功能和工具,开发者可以利用Unity的编程接口和资源来访问和处理Hololens2深度相机的数据。比如,可以使用Unity的ARFoundation插件,来访问Hololens2深度相机的深度图像,并将其与真实世界的图像进行融合,从而实现更加逼真的AR体验。 通过Unity和Hololens2深度相机的结合,开发者可以创造出更加交互性和真实感的AR应用。例如,在游戏中可以实现更好的物体检测和碰撞效果,或者在实时AR演示中可以精确地与场景中的物体进行互动。这种结合还有利于开发者完成虚拟物体在现实世界中的精准定位和跟踪,为用户提供更加沉浸式的增强现实体验。 总之,Unity和Hololens2深度相机是两个相互协作的技术,可以一起使用来实现更加出色和逼真的增强现实应用。这种结合为开发者提供了更多创造和创新的空间,让用户可以享受到更加令人印象深刻的AR体验。 ### 回答2: Unity Hololens 2是一种增强现实(AR)头戴式设备,具有内置的深度相机。深度相机使用红外(IR)光的传感器,它可以感知和测量物体之间的距离,并生成真实场景的三维模型。 利用Hololens 2的深度相机,开发者可以创建逼真的增强现实应用程序。深度相机可以提供更准确的环境感知,通过生成点云数据和深度图像,捕捉周围环境的准确形状和位置。这使得在AR场景中添加虚拟物体更加准确且逼真。 深度相机还可以用于实现手势和交互控制。通过识别用户的手部和手指在三维空间中的位置和动作,Hololens 2可以允许用户通过手势操作虚拟对象或与应用程序进行交互。这种无需物理控制器的交互方式可以增加用户的沉浸感和自由度。 除了增强现实应用程序,Hololens 2的深度相机还可以用于计算机视觉和场景理解等领域。通过与Unity引擎结合,开发者可以使用深度相机的数据进行虚拟现实、人机交互、感知建模和智能辅助等应用的开发。 总体而言,Hololens 2的深度相机是一项强大的技术,它为开发者提供了更高级别的环境感知和交互控制功能,使得AR应用程序在可视化、交互和体验上更具真实感和创新性。 ### 回答3: Unity Hololens 2 是一种增强现实(AR)头戴式设备,它配备了一台深度相机。深度相机利用时间飞行(Time-of-Flight)技术,通过发送和接收红外光信号,并精确测量其返回时间来实现深度感知。 与普通相机不同的是,深度相机可以捕捉到场景中物体的距离信息,而不仅仅是颜色和纹理。这意味着Unity Hololens 2可以更精确地将虚拟物体与真实世界的物体进行交互,从而实现更逼真的增强现实体验。 深度相机可以帮助Unity Hololens 2实现空间映射和环境感知。它可以创建一个三维点云地图,将真实世界中的物体转换为虚拟环境中的可识别对象。通过实时捕捉深度数据,Hololens 2可以实现更准确的空间理解,从而为用户提供更好的AR体验。 除了用于空间映射和环境感知,深度相机还可以用于手势识别、空中操作等交互方式。通过实时的深度信息,Hololens 2可以识别用户的手势,并根据手势进行相应的操作。这一功能可以极大地提高用户与AR内容的互动性和自由度。 总之,Unity Hololens 2配备的深度相机是一项强大的技术,它使得AR体验更加真实、交互更加自然。通过空间映射、环境感知和手势识别等功能,深度相机Hololens 2提供了更多的应用场景和可能性,使用户能够以前所未有的方式与虚拟世界进行互动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值