c # - Sådan får du Hololens Locatable Camera visning og projektionsmatricer ud af WinRT Windows Media API

Indlæg af Hanne Mølgaard Plasc

Problem



Dokumentationen til Hololens giver et eksempel på, hvordan man udvinder de lokaliserbare kameraer og projektionsmatricer ved hjælp af Media Foundation API her: https://developer.microsoft.com/en-us/windows/mixed-reality/locatable\_camera#locating\_the\_device\_camera\_in\_the\_world. [7]


Det hævder, at dette også er muligt med WinRT API, og links til denne dokumentationsreference: https://docs.microsoft.com/en-us/uwp/api/Windows.Media.Devices.Core.CameraIntrinsics.[8]


Denne klasse ser imidlertid ikke ud til at have nogen API til at hente attributterne for udvidede Hololens, kun de standard Windows Phone-enheder som forvrængningsmatrixen og pinholeegenskaberne.


Er Hololens dokumentation forkert, og er det simpelthen ikke muligt at hente Metadata med lokaliserbar kamera i WinRT API? Eller mangler jeg noget?


Det rumlige koordinatsystem (den tredje og sidste udvidede stikmetadataattribut) ser ud til at være tilgængelig som MediaFrameReference.CoordinateSystem (https://docs.microsoft.com/en-us/uwp/api/windows. media.capture.frames.mediaframereference), hvilket gør dette endnu mere forvirrende ... [9]

Bedste reference


Du kan kaste det indfangede CapturedPhoto objekt til IMFGetService interface. Derefter kan du kalde IMFGetService::GetService metode med MF\_WRAPPED\_SAMPLE\_SERVICE som service GUID, og ​​det vil give dig den oprindelige IMFSample. Derefter kan du hente de 3 kameraattributter (koordinatsystem, se transformation og projektionstransformation) som beskrevet i dokumentationen. [10] [11] [12] [13]


Nu kan du prøve at lave alt, hvad der er i C # ved manuelt at deklare disse grænseflader, men det ville være meget lettere at lave i C ++.

Andre referencer 1


Jeg havde lige det samme problem. Kameraets rumlige koordinatsystem er tilgængeligt via MediaFrameReference.CoordinateSystem . Men projektionsmatrixen udbydes ikke i klassen MediaFrameReference . Jeg løste problemet ved at kigge op på projektionsmatrixen i kortet MediaFrameReference.Properties . Grundidéen er vist her, men jeg havde brug for at tilpasse koden til UWP. Min arbejdskode er vist nedenfor. [14]


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