问题
I'm trying to access intrinsic matrix following this answer.
By running the commend below, I was able to get a 48-byte AnyObject, and I further convert it into a CFData.
let camData = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, nil)
However, I checked the output of sampleBuffer in 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);
How should I access the value in the matrix_float3x3
from the CFData
?
回答1:
This should work:
- Use the bridging from
CFData
toNSData
toData
, and - the
withUnsafeBytes
method to get a pointer of the desired type to the data bytes, .pointee
to dereference the pointer.
Example:
if let camData = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, nil) as? Data {
let matrix: matrix_float3x3 = camData.withUnsafeBytes { $0.pointee }
// ...
}
The pointer type ($0
inside the closure) is inferred from the context
as UnsafePointer<matrix_float3x3>
.
回答2:
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));
}
来源:https://stackoverflow.com/questions/48565286/swift-3-how-to-access-the-value-of-matrix-float3x3-in-a-48-byte-cfdata