前提
Swiftでカメラからの映像を Visionほかで処理させています。実際は、1フレームで完了しませんので飛び飛びの画像処理です。処理中を示すフラグを用意して適当に間引きしています。
Date() 関数の差で処理時間を計測してみると、手元の iPhoneの遅い機種では1.2秒、速いのは0.4秒程度でした。フレームレイトを30/秒として、間引きされたフレーム数は 36 or 13 程度のはずです。
処理は正しいようですが、実際に間引きされたフレーム数を計数したいのですが上手くゆかなくて質問しました。
実現したいこと
1。操作時、見かけ上の機種のスピード感の差を少なくしたい。
2。そこで、実行中に間引きしたフレーム数をカウントする。
2。カウント数に反比例した分を意図的に間引く処理を追加する。
発生している問題
計測カウンタの値が常にゼロ (counter=0)になる
該当のソースコード
使用言語:Swift
//クラス変数
var runing = false //実行中フラグ
var counter = 0 //間引きをカウントする
//フレーム毎に呼ばれるデリゲートメソッド
func captureOutput(_ output: AVCaptureOutput,
didOutput sampleBuffer: CMSampleBuffer,
from connection: AVCaptureConnection) {
**//実行中は計数のみ** guard !self.runing else { //間引き数の計数 self.counter += 1 return; } **//実行開始** self.runing = true //実行中フラグ //CMSampleBuffer映像をUIImage画像に変換 let img: UIImage = imageFromSampleBuffer(sampleBuffer: sampleBuffer) // -- UIImageを使用した処理の開始 -- ..... ..... //Vision 顔の検出 func faceDetct(_ image: UIImage) { let request = VNDetectFaceRectanglesRequest { (request, Error) in for observation in request.results as! [VNFaceObservation] { ..... ..... //顔をクロップして、モデルによるAI処理、表示など self.predict( ... ... ... ) //メソッドの呼び出し } **//実行終了** self.runing = false //実行中フラグ **//間引きしたフレーム数の確認** print("flame number: \(self.counter)") // **常にゼロとなる!** } //クロージャのリクエスト実行 //Visionが処理できるデータ型に画像を変換 if let cgImage = image.cgImage { //画像データを設定してリクエストヘッダを生成 let handler = VNImageRequestHandler(cgImage: cgImage, options:[:]) //顔検出を実行 try? handler.perform([request]) } ..... ..... }
}
試したこと
Date(start) 〜 Date().timeIntervalSince(start) による
1。フレームのサイクルの計測
2。処理時間の計測
補足情報(FW/ツールのバージョンなど)
バージョンなど
macOS 12.3.1
Xcode 13.3.1
0 コメント