Swift 中深度数据的深拷贝 CVPixelBuffer

问题描述

我从 AVCaptureSynchronizedDataCollection 获取深度数据流,并尝试异步处理 depthDataMap。我试图深度复制 CVPixelBuffer,因为我不想在处理时阻塞相机,但复制的缓冲区似乎不正确,因为我不断收到错误的访问错误。这是我用来深度复制 CVPixelBuffer 的代码

func duplicatePixelBuffer(input: CVPixelBuffer) -> CVPixelBuffer {
    var copyOut: CVPixelBuffer?
    let bufferWidth = CVPixelBufferGetWidth(input)
    let bufferHeight = CVPixelBufferGetHeight(input)
    let bytesPerRow = CVPixelBufferGetBytesPerRow(input)
    let bufferFormat = CVPixelBufferGetPixelFormatType(input)
        
    _ = CVPixelBufferCreate(kcfAllocatorDefault,bufferWidth,bufferHeight,bufferFormat,CVBufferGetAttachments(input,CVAttachmentMode.shouldPropagate),&copyOut)
    let output = copyOut!
    // Lock the depth map base address before accessing it
    CVPixelBufferLockBaseAddress(input,CVPixelBufferLockFlags.readOnly)
    CVPixelBufferLockBaseAddress(output,CVPixelBufferLockFlags.readOnly)
    let baseAddress = CVPixelBufferGetBaseAddress(input)
    let baseAddresscopy = CVPixelBufferGetBaseAddress(output)
    memcpy(baseAddresscopy,baseAddress,bufferHeight * bytesPerRow)
        
    // Unlock the base address when finished accessing the buffer
    CVPixelBufferUnlockBaseAddress(input,CVPixelBufferLockFlags.readOnly)
    CVPixelBufferUnlockBaseAddress(output,CVPixelBufferLockFlags.readOnly)
    NSLog("Pixel buffer original: \(input)")
    NSLog("Pixel buffer copy: \(output)")
    return output
}

我在返回之前检查了两个 CVPixelBuffer 对象,似乎复制的缓冲区没有 iosurface。另外,原始文件中的propagatedAttachments 中有一个MetadataDictionary 对象,但副本中的MetadataDictionary 对象直接位于属性中。

我在 Stack Overflow 上尝试了一些其他解决方案,但没有成功,因为我的飞机是非平面的。希望对此有任何见解,或者我是否应该完全尝试不同的方法。谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...