Hololens的文档提供了如何使用Media Foundation API在此处提取可定位相机视图和投影矩阵的示例:https://developer.microsoft.com/en-us/windows/mixed-reality/locatable_camera#locating_the_device_camera_in_the_world。
它声称使用WinRT API也可以做到这一点,并且链接到此文档参考:https://docs.microsoft.com/en-us/uwp/api/Windows.Media.Devices.Core.CameraIntrinsics。
但是,这个类似乎没有任何API可以检索扩展的Hololens属性,只有默认的Windows Phone类似于失真矩阵和针孔属性。
Hololens文档是否不正确,是否无法在WinRT API中检索可定位的相机元数据?或者我错过了什么?
空间坐标系(第三个和最后一个扩展样本元数据属性)似乎确实可用作 MediaFrameReference.CoordinateSystem (https://docs.microsoft.com/en-us/uwp/api/windows.media.capture.frames.mediaframereference),这使得这更加令人困惑...... < / p>
答案 0 :(得分:1)
您可以将捕获的CapturedPhoto
对象强制转换为IMFGetService
接口。然后,您可以使用MF_WRAPPED_SAMPLE_SERVICE
作为服务GUID调用IMFGetService::GetService
方法,这将为您提供本机IMFSample
。从那里,您可以检索文档中概述的3个摄像机属性(坐标系,视图变换和投影变换)。
现在,您可以尝试通过手动声明这些接口来编写C#中的所有内容,但在C ++中这样做会更容易。
答案 1 :(得分:0)
我遇到了同样的问题。可以通过 MediaFrameReference.CoordinateSystem 获得相机的空间坐标系。但 MediaFrameReference 类中未提供投影矩阵。我通过查找 MediaFrameReference.Properties 地图中的投影矩阵解决了这个问题。显示基本思路here但是我需要调整UWP的代码。我的工作代码如下所示。
EXTERN_GUID(MFSampleExtension_Spatial_CameraProjectionTransform, 0x47f9fcb5, 0x2a02, 0x4f26, 0xa4, 0x77, 0x79, 0x2f, 0xdf, 0x95, 0x88, 0x6a);
MediaFrameReference^ frame = ...; // your frame
auto projectionTransformProperty= (Windows::Foundation::IPropertyValue^)frame->Properties->Lookup(MFSampleExtension_Spatial_CameraProjectionTransform);
Platform::Array<unsigned char>^ projectionMatrixByteArray = ref new Platform::Array<unsigned char>(4*4*4);
projectionTransformProperty->GetUInt8Array(&projectionMatrixByteArray);
float* projectionMatrixValues= reinterpret_cast<float*>(projectionMatrixByteArray->Data);
//projectionMatrixValues now contains the 16 entries of the projection matrix