質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

0回答

305閲覧

Swift カメラ映像の処理時間をフレーム数でカウントしたい

sottos

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2022/07/21 07:26

編集2022/07/24 07:46

前提

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)") // **常にゼロとなる!** **_//追加:この行が抜けていました_** **_self.counter = 0 //カウンターをリセット_** } //クロージャのリクエスト実行 //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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問