2017-03-29 28 views
0

Hololens的文檔給出瞭如何使用Media Foundation API在此處提取Locatable攝像頭視圖和投影矩陣的示例:https://developer.microsoft.com/en-us/windows/mixed-reality/locatable_camera#locating_the_device_camera_in_the_world如何從WinRT中獲取Hololens Locatable攝像頭視圖和投影矩陣Windows.Media API

它聲稱,這也可以用WinRT API和鏈接到本文檔參考:https://docs.microsoft.com/en-us/uwp/api/Windows.Media.Devices.Core.CameraIntrinsics

但是,該類似乎沒有任何API來檢索擴展Hololens屬性,只有默認的Windows Phone類似於失真矩陣和針孔屬性。

Hololens文檔是否不正確,是否無法在WinRT API中檢索Locatable Camera元數據?或者我錯過了什麼?

空間座標系(第三和最後一個樣本擴展元數據屬性)似乎是可以作爲MediaFrameReference.CoordinateSystemhttps://docs.microsoft.com/en-us/uwp/api/windows.media.capture.frames.mediaframereference),這使得這個更加混亂......

回答

1

,就可以把拍攝CapturedPhoto對象爲IMFGetService接口。然後,您可以撥打IMFGetService::GetService方法MF_WRAPPED_SAMPLE_SERVICE作爲服務GUID,那會給你原生IMFSample。從這裏,您可以檢索文檔中概述的3個相機屬性(座標系,視圖變換和投影變換)。

現在,您可以嘗試通過手動聲明這些接口來編寫C#中的所有內容,但在C++中執行會更容易。

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