4

我正在尝试按照这个答案访问内在矩阵。

通过运行下面的命令,我得到了一个 48 字节的AnyObject,我进一步将其转换为CFData

let camData = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, nil)

但是,我检查了 sampleBuffer 的输出CMSampleBuffer.h

/*! @constant   kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix
     @abstract  Indicates the 3x3 camera intrinsic matrix applied to the current sample buffer.
     @discussion Camera intrinsic matrix is a CFData containing a matrix_float3x3, which is column-major.
        ....
 */
CM_EXPORT const CFStringRef kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix  // CFData (matrix_float3x3) __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_11_0);

我应该如何访问matrix_float3x3from 中的值CFData

4

2 回答 2

3

这应该有效:

  • 使用桥接from CFDatatoNSDataData
  • withUnsafeBytes获取指向数据字节的所需类型的指针的方法,
  • .pointee取消引用指针。

例子:

if let camData = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, nil) as? Data {
    let matrix: matrix_float3x3 = camData.withUnsafeBytes { $0.pointee }

    // ...

}

指针类型($0在闭包内)从上下文推断为UnsafePointer<matrix_float3x3>.

于 2018-02-01T14:54:47.197 回答
0

That's version of Martin R's answer for objective-c:

CFTypeRef cameraIntrinsicData = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, nil);
if(cameraIntrinsicData != nil){
    CFDataRef cfdr = (CFDataRef)(cameraIntrinsicData);
    matrix_float3x3 camMatrix = (matrix_float3x3 *)(CFDataGetBytePtr(cfdr));
}
于 2019-10-03T20:37:22.897 回答