Remember to maintain security and privacy. Do not share sensitive information. Procedimento.com.br may make mistakes. Verify important information. Termo de Responsabilidade

Como Manipular CVPixelBuffer no Ambiente Apple para Processamento de Imagem

O CVPixelBuffer é uma estrutura fundamental no framework Core Video da Apple, utilizada para representar um buffer de pixel em memória. Ele é amplamente utilizado no desenvolvimento de aplicativos que lidam com processamento de imagem e vídeo, como edição de vídeo, realidade aumentada e machine learning. Neste artigo, vamos explorar como criar e manipular um CVPixelBuffer no ambiente Apple, com exemplos práticos em Swift.


Exemplos:


1. Criando um CVPixelBuffer:


Para criar um CVPixelBuffer, você pode usar a função CVPixelBufferCreate. Aqui está um exemplo de como criar um buffer com dimensões específicas e um formato de pixel:


   import CoreVideo

func createPixelBuffer(width: Int, height: Int) -> CVPixelBuffer? {
var pixelBuffer: CVPixelBuffer?
let attributes: [String: Any] = [
kCVPixelBufferCGImageCompatibilityKey as String: true,
kCVPixelBufferCGBitmapContextCompatibilityKey as String: true
]
let status = CVPixelBufferCreate(
kCFAllocatorDefault,
width,
height,
kCVPixelFormatType_32ARGB,
attributes as CFDictionary,
&pixelBuffer
)

guard status == kCVReturnSuccess else {
print("Error: Could not create CVPixelBuffer")
return nil
}

return pixelBuffer
}

// Uso do exemplo:
if let pixelBuffer = createPixelBuffer(width: 640, height: 480) {
print("CVPixelBuffer criado com sucesso!")
}

2. Bloqueando e Desbloqueando o CVPixelBuffer:


Antes de acessar os dados de um CVPixelBuffer, você deve bloqueá-lo para garantir que os dados de pixel não sejam alterados durante o acesso. Após a manipulação, desbloqueie-o.


   func manipulatePixelBuffer(_ pixelBuffer: CVPixelBuffer) {
CVPixelBufferLockBaseAddress(pixelBuffer, .readOnly)

// Aqui você pode acessar os dados de pixel
if let baseAddress = CVPixelBufferGetBaseAddress(pixelBuffer) {
// Manipule os dados de pixel conforme necessário
}

CVPixelBufferUnlockBaseAddress(pixelBuffer, .readOnly)
}

// Uso do exemplo:
if let pixelBuffer = createPixelBuffer(width: 640, height: 480) {
manipulatePixelBuffer(pixelBuffer)
}

3. Convertendo UIImage para CVPixelBuffer:


Converter uma UIImage para um CVPixelBuffer é útil quando você deseja processar imagens capturadas ou carregadas no aplicativo.


   import UIKit

func pixelBufferFromImage(image: UIImage) -> CVPixelBuffer? {
guard let cgImage = image.cgImage else { return nil }

let frameSize = CGSize(width: cgImage.width, height: cgImage.height)
var pixelBuffer: CVPixelBuffer?
let options: [String: Any] = [
kCVPixelBufferCGImageCompatibilityKey as String: true,
kCVPixelBufferCGBitmapContextCompatibilityKey as String: true
]

let status = CVPixelBufferCreate(
kCFAllocatorDefault,
Int(frameSize.width),
Int(frameSize.height),
kCVPixelFormatType_32ARGB,
options as CFDictionary,
&pixelBuffer
)

guard status == kCVReturnSuccess, let buffer = pixelBuffer else {
return nil
}

CVPixelBufferLockBaseAddress(buffer, [])
let data = CVPixelBufferGetBaseAddress(buffer)
let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
let context = CGContext(
data: data,
width: cgImage.width,
height: cgImage.height,
bitsPerComponent: 8,
bytesPerRow: CVPixelBufferGetBytesPerRow(buffer),
space: rgbColorSpace,
bitmapInfo: CGImageAlphaInfo.noneSkipFirst.rawValue
)

context?.draw(cgImage, in: CGRect(x: 0, y: 0, width: frameSize.width, height: frameSize.height))
CVPixelBufferUnlockBaseAddress(buffer, [])

return buffer
}

// Uso do exemplo:
if let image = UIImage(named: "example.png"),
let pixelBuffer = pixelBufferFromImage(image: image) {
print("UIImage convertida para CVPixelBuffer com sucesso!")
}

To share Download PDF

Gostou do artigo? Deixe sua avaliação!
Sua opinião é muito importante para nós. Clique em um dos botões abaixo para nos dizer o que achou deste conteúdo.