Эффективный способ конвертировать CVPixelBuffer в NSArray RGB - PullRequest
0 голосов
/ 05 мая 2020

Учитывая 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
    }
}

Это самый эффективный способ сделать это?

...