Swift 3:如何在48字节的CFData中访问matrix_float3x3的值?

问题描述 投票:3回答:1

我想在这个answer之后访问内在矩阵。

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

let camData = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, nil)

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

/*! @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_float3x3访问CFData中的值?

ios swift computer-vision ios11 cfdata
1个回答
2
投票

这应该工作:

  • 使用从CFDataNSDataData的桥接,以及
  • withUnsafeBytes方法获取所需类型的指针到数据字节,
  • .pointee取消引用指针。

例:

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

    // ...

}

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

© www.soinside.com 2019 - 2024. All rights reserved.