Учитывая CVPixelBuffer, мне нужна функция, которая выводит значения RGB в 3-мерный массив, представляющий высоту, ширину и цветовой канал для каждого пикселя.
Вот как я делаю сейчас:
import Vision
typealias ImgArray = Array<Array<[UInt8]>>
typealias ImgRow = Array<[UInt8]>
extension CVPixelBuffer {
func toRGBArray() -> NSArray {
let width = CVPixelBufferGetWidth(self)
let height = CVPixelBufferGetHeight(self)
let bytesPerRow = CVPixelBufferGetBytesPerRow(self)
var imgArray:ImgArray = []
// Lock buffer
CVPixelBufferLockBaseAddress(self, .readOnly)
// Unlock buffer upon exiting
defer {
CVPixelBufferUnlockBaseAddress(self, .readOnly)
}
if let baseAddress = CVPixelBufferGetBaseAddressOfPlane(self, 0) {
let buffer = baseAddress.assumingMemoryBound(to: UInt8.self)
for y in (0..<height) {
var thisRow:ImgRow = []
for x in (0..<width) {
let ix = y * bytesPerRow + x * 4
thisRow.append([buffer[ix + 1],
buffer[ix + 2],
buffer[ix + 3]
])
}
imgArray.append(thisRow)
}
}
return [imgArray] as NSArray
}
}
Это самый эффективный способ сделать это?