LoginSignup
4
4

More than 5 years have passed since last update.

GPUImageVideoCameraを入力に毎フレームごとに何か処理をしたい

Posted at

問題

まず毎フレームごとに何か処理したい場合は
処理したい画像を出力するGPUImageFilterのframeProcessingCompletionBlockに処理を設定する。
しかし単純にimageFromCurrentFramebufferを呼び出しても上手くイメージを取得できない。対応策がわかったので記録を残す

対応

問題はgithubのissueにあるように
frameProcessingCompletionBlock処理内でuseNextFrameForImageCaptureが呼ばれることを設計者が想定していなかったことの模様。

frameProcessingCompletionBlockが呼び出された時点でこちらが必要としているframeがすでにfilterを通過済みのため、frameProcessingCompletionBlock内でuseNextFrameForImageCaptureを呼び出しても次のフレーム用となる。

事前にframeProcessingCompletionBlock処理呼び出し前に
useNextFrameForImageCaptureを呼び出したら上手く行った


import UIKit
import GPUImage


class ViewController: UIViewController {

    @IBOutlet weak var outputView: GPUImageView!
    @IBOutlet weak var copyImageView: UIImageView!

    var videoCamera:GPUImageVideoCamera?
    var grayScalefilter:GPUImageGrayscaleFilter?

    override func viewDidLoad() {
        super.viewDidLoad()

        self.videoCamera = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPreset352x288, cameraPosition: .Back)
        self.videoCamera?.outputImageOrientation = .Portrait

        self.grayScalefilter = GPUImageGrayscaleFilter()
        videoCamera?.addTarget(grayScalefilter)

        let lastFilter = grayScalefilter
        lastFilter?.addTarget(outputView)

        lastFilter?.frameProcessingCompletionBlock = { (output,t) in

            //次回frameProcessingCompletionBlockが呼び出された時のための対処
            defer { output!.useNextFrameForImageCapture() }

            //uiimageの取得
            guard let image = output!.imageFromCurrentFramebuffer() else {
                print("error get image!")
                return
            }

            //mainスレッドで処理する
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                self.copyImageView.image = image
            })

        }

        //最初のフレーム用の呼び出し
        lastFilter?.useNextFrameForImageCapture()
        videoCamera?.startCameraCapture()

    }

}

参考

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4