CMSampleBuffer
을 카메라 출력에서 vImage
으로 변환하고 나중에 처리하려고합니다. (질문에서 고려되지 않는 메모리 관리 및 오류)CMSampleBuffer 프레임을 vImage로 변환 할 때 색상이 잘못되었습니다.
구현 :
비디오 출력 장치를 구성 :
불행하게도, 심지어는 더 이상 편집하지 않고, 내가 버퍼에서 얻을 프레임은 잘못된 색상을 가지고 :CASampleBuffer
에서
vImage
만들기
videoDataOutput = AVCaptureVideoDataOutput()
videoDataOutput.videoSettings = [String(kCVPixelBufferPixelFormatTypeKey): kCVPixelFormatType_32BGRA]
videoDataOutput.alwaysDiscardsLateVideoFrames = true
videoDataOutput.setSampleBufferDelegate(self, queue: captureQueue)
videoConnection = videoDataOutput.connection(withMediaType: AVMediaTypeVideo)
captureSession.sessionPreset = AVCaptureSessionPreset1280x720
let videoDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
guard let videoDeviceInput = try? AVCaptureDeviceInput(device: videoDevice) else {
return
}
카메라로부터받은 CVPixelBuffer가있는 UIImage로 내보낼 테스트를 위해서
, 그러나 비디오 버퍼에 추가하는 동일한 결과를 갖는다 : 0
// Convert `CASampleBuffer` to `CVImageBuffer` guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return } var buffer: vImage_Buffer = vImage_Buffer() buffer.data = CVPixelBufferGetBaseAddress(pixelBuffer) buffer.rowBytes = CVPixelBufferGetBytesPerRow(pixelBuffer) buffer.width = vImagePixelCount(CVPixelBufferGetWidth(pixelBuffer)) buffer.height = vImagePixelCount(CVPixelBufferGetHeight(pixelBuffer)) let vformat = vImageCVImageFormat_CreateWithCVPixelBuffer(pixelBuffer) let bitmapInfo:CGBitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.last.rawValue | CGBitmapInfo.byteOrder32Little.rawValue) var cgFormat = vImage_CGImageFormat(bitsPerComponent: 8, bitsPerPixel: 32, colorSpace: nil, bitmapInfo: bitmapInfo, version: 0, decode: nil, renderingIntent: .defaultIntent) // Create vImage vImageBuffer_InitWithCVPixelBuffer(&buffer, &cgFormat, pixelBuffer, vformat!.takeRetainedValue(), cgColor, vImage_Flags(kvImageNoFlags))
있는 UIImage 버퍼로 변환.
var dstPixelBuffer: CVPixelBuffer?
let status = CVPixelBufferCreateWithBytes(nil, Int(buffer.width), Int(buffer.height),
kCVPixelFormatType_32BGRA, buffer.data,
Int(buffer.rowBytes), releaseCallback,
nil, nil, &dstPixelBuffer)
let destCGImage = vImageCreateCGImageFromBuffer(&buffer, &cgFormat, nil, nil, numericCast(kvImageNoFlags), nil)?.takeRetainedValue()
// create a UIImage
let exportedImage = destCGImage.flatMap { UIImage(cgImage: $0, scale: 0.0, orientation: UIImageOrientation.right) }
DispatchQueue.main.async {
self.previewView.image = exportedImage
}
제거 하시겠습니까? CGBitmapInfo.byteOrder32Little.rawValue' 도움? 노란색 오리가 FFFF00에서 00FF00으로 이동 했으므로 0 알파를 포함하면 바이트 스와핑 문제가 될 수 있습니다. –
@RhythmicFistman 그건 재미 있어요. 나는 디폴트 순서를 유지하기 위해'byteOrder32Little'을 제거하고'CGBitmapInfo (rawValue : CGImageByteOrderInfo.orderMask.rawValue | CGImageAlphaInfo.last.rawValue)'로 변경하려고 시도했지만 결과는 모든 경우에서 똑같이 보입니다. – Dawid
실행 가능한 샘플에 연결할 수 있습니까? –