CMSampleBuffer
をカメラ出力からvImage
に変換して処理しようとしています。残念ながら、でも任意のさらに編集せずに、私はバッファから取得したフレームは、間違った色を持っていますvimageに変換されたCMSampleBufferフレームの色が間違っています
実装(メモリ管理とエラーが問題では考慮されません):
は、ビデオ出力デバイスの設定:
: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' help?あなたの黄色のアヒルはFFFF00から00FF00になりました。そのため、アルファベットがゼロの場合は、バイトスワップの問題になります。 –
@RhythmicFistmanそれは面白いです。私は 'byteOrder32Little'を削除しようとしましたが、' CGBitmapInfo(rawValue:CGImageByteOrderInfo.orderMask.rawValue | CGImageAlphaInfo.last.rawValue) 'に変更してデフォルトの順序を保ちましたが、結果はまったく同じように見えます。 – Dawid
実行可能なサンプルにリンクできますか? –