2017-03-24 17 views
0

sampleBufferをUIImageに変換しようとしていて、colorspaceGrayの画像ビューで表示しようとしています。しかし、それは次のイメージとして表示されます。この質問には何が間違っていますか? CMSampleBufferをどのように変換できますか? It is a gray version of a red colored imageCMSampleBufferをUIImageに変換する

答えて

5

変換は単純です:

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) { 

     let imageBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)! 

     let ciimage : CIImage = CIImage(cvPixelBuffer: imageBuffer) 

     let image : UIImage = self.convert(cmage: ciimage) 

    } 

// Convert CIImage to CGImage 
    func convert(cmage:CIImage) -> UIImage 
    { 
     let context:CIContext = CIContext.init(options: nil) 
     let cgImage:CGImage = context.createCGImage(cmage, from: cmage.extent)! 
     let image:UIImage = UIImage.init(cgImage: cgImage) 
     return image 
    } 
+0

ありがとう、また、UIImageをCMSampleBufferに変換する方法もありますか? – user924

1

CMSampleBufferは、あなたが、直接グレースケール画像を構築し、そこからRGBAデータを与えているように見えます。新しいバッファを構築する必要があります。新しいバッファは、ピクセルごとにgray = (pixel.red+pixel.green+pixel.blue)/3のような処理を行います。または、受け取ったデータから通常のRGBAイメージを作成し、それをグレースケールに変換する必要があります。

しかし、あなたのコードでは、全く移行しません。どのような種類のデータが入っていても、生のポインタをCVPixelBufferGetBaseAddressを使用してバッファに入れました。そして、受け取ったデータがグレースケールであると仮定して、イメージを作成するのに同じポインタを渡すだけです。

+0

私はそれがキャプチャ出力が期待するような形式になるように、キャプチャの出力形式を指定することも可能だと思います。 –

+0

データが既にグレースケールの場合は、なぜこれらのストリップが来るのですか?なぜ普通の灰色のイメージだけではないのですか? – mumu

+0

@Matic私はこの前に1番目の方法を試しました。しかし、コンテキストからイメージを作成する際にクラッシュし、このエラーが発生しました。コピー読み取り専用:vm_copy failed:ステータス1 – mumu

関連する問題