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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

3580閲覧

OpenCVでWebカメラのシャッター時間を設定したい

nuiri1343

総合スコア54

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/08/27 05:41

前提・実現したいこと

現在,Webカメラで指定したfpsで静止画像を撮影するプログラムを作成しております.
手動で経過時間を取得し,一定時間経過するたびに撮影を行うという方法を採用しております.

発生している問題・エラーメッセージ

カメラの画像撮影に必要以上に時間がかかっているようで,遅延によって願ったとおりのFPSで撮影できません.
このプログラムの目的は,20FPSでできるだけ誤差無く撮影できるようにしたいというものです.
もしかしたら,シャッター時間が長いのかもしれないと思ったのですが,OpenCVでシャッター時間を設定するにはどうしたらいいのでしょうか.

該当のソースコード

c++

1#include "main.h" 2 3int main(void) { 4 int fps = 10; //FPS指定 5 double spf = 1.0 / fps; 6 const int maxCount = 100; 7 int i; 8 int key; 9 10 LARGE_INTEGER freq; 11 LARGE_INTEGER start, now; 12 double time; 13 double count; 14 15 char name[256]; 16 17 cv::Mat frame; 18 cv::VideoCapture cap(0); 19 20 if (!cap.isOpened()) { 21 return -1; 22 } 23 24 cap.set(CV_CAP_PROP_FPS, 20); //何を設定しているんだろう? 25 cap.set(CV_CAP_PROP_FRAME_WIDTH, 640); 26 cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480); 27 28 29 if (!QueryPerformanceFrequency(&freq)) { //経過時間の単位取得 30 return -1; //取得失敗 31 } 32 33 if (!QueryPerformanceCounter(&start)) { //初回経過時間取得 34 return -1; 35 } 36 37 count = 1.00; 38 while (1) { 39 if (!QueryPerformanceCounter(&now)) { //現在経過時間取得 40 return -1; 41 } 42 time = (double)(now.QuadPart - start.QuadPart) / freq.QuadPart; //経過時間算出 43 44 if (time >= count) { //count以上の時間が経過していた場合撮影を行う. 45 46 //printf("count = %f : %.3f : ", count,time); 47 48 cap >> frame; 49 if (!QueryPerformanceCounter(&now)) { 50 return -1; 51 } 52 time = (double)(now.QuadPart - start.QuadPart) / freq.QuadPart; //撮影後の経過時間算出 53 54 //printf("%.3f\n", time); 55 56 sprintf_s(name, "%.3f.jpg", time); 57 cv::imwrite(name, frame); 58 cv::imshow("Capture", frame); 59 count += spf; 60 } 61 62 key = cv::waitKey(1); 63 if (key == 0x1b) 64 break; 65 66 } 67 68 getchar(); 69 70 return 0; 71} 72

補足情報(FW/ツールのバージョンなど)

Windows10
VisualStudio2017
OpenCV 3.4.1

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

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

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

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

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

bsk

2018/08/27 09:47

記載されているコードの4行目がfps=10ですが記載ミスですか?そのままだと10fpsしかでません。
nuiri1343

2018/08/28 04:42

あ,すみません.最終的にはfps=20にしたいのですが,そこまで早くすると遅延によってよくわからんことになってしまったので,あくまで実験段階として10fpsで試してました.混乱するようなソースコードを載せてしまってすみません.
guest

回答4

0

実務でWebカメラで40FPSを使用している実例としてOpenCVのVideoLibraryは汎用に作成を目的としているため実FPSは理論値より絶対遅いです。実務ではDirectXのライブラリーを作成して32Bitsでキャプチャーして24Bitsに変換及びWebカメラの圧縮の設定で実現できるはず。

実例では過去から回答していますがEWCLIB(ググればすぐ出ます。ヘッダーで全部定義している非常に参考になる実装例)でサンプルしてみる。また例で各解像度・圧縮形式・FPSの設定と実実行の結果表示ができます。

投稿2018/08/29 14:05

MasahikoHirata

総合スコア3747

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

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

0

cap.set(CV_CAP_PROP_FPS, 20); //何を設定しているんだろう?

ここで20fpsにカメラは設定されてると思います。(カメラによっては設定できてない場合もありますが)
仮に20fpsに設定されている場合最大20fpsなので間に処理を挟むと20fps+αの時間になるかもしれないのでここはコメントアウトするかタイマーまるごと削除してテストするのがいいと思います。

あとハードウェア的な問題として暗い場所だと光量上げるために勝手にfps下げるwebカメラがまぁまぁあります。
なのでもし暗い箇所で撮影してたら明るいところでテストしてみるのも手です。

投稿2018/08/28 12:45

bsk

総合スコア174

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

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

0

私もそう思います。

time-countで、本来シャッタを切りたい時間に対する誤差が求まるはずですので、それをprintfしつつ、cv::imwriteをコメントアウトして実験してみたら、わかると思います。
もしそうならファイルでなくメモリに置いとけばいいんじゃないでしょうか

投稿2018/08/27 13:44

yutakau8255

総合スコア99

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

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

nuiri1343

2018/08/28 04:45

かもしれませんね. メモリに置いておくや,HDDからSSDにしたりしたら高速化できそうです. ところで,シャッター時間を設定する方法はあるのでしょうか? マニュアルで(ソースコードで)指定できたら,さらにFPSを固定させやすいと思うんです.
yutakau8255

2018/08/28 12:46

「シャッター時間」という用語のは、どういう意味で言われていますか? もし、一眼レフ等で言う露光時間をイメージされているなら、多くの安価なUSBカメラでは、そもそも正確に設定きないのではないでしょうか。
yutakau8255

2018/08/28 13:24

他の方も指摘されてますけど、安いUSBカメラは、フレームレートを設定できてもその通りのレートで撮影してくれるとは限らないんです。CMOSセンサに入る光量が少なくてノイジーな画像になるくらいなら、フレームレートを下げて少しでも綺麗な画像を出力した方がよいと考えて、そういう仕様で設計されているからです。
guest

0

ベストアンサー

cv::imwrite()が時間掛かりすぎてたりしませんか?

投稿2018/08/27 11:50

daisuke7

総合スコア1563

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

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

nuiri1343

2018/08/28 04:45

かもしれませんね. メモリに置いておくや,HDDからSSDにしたりしたら高速化できそうです. ところで,シャッター時間を設定する方法はあるのでしょうか? マニュアルで(ソースコードで)指定できたら,さらにFPSを固定させやすいと思うんです.
daisuke7

2018/08/28 05:21

私のノウハウ不足ってだけかもしれませんが、 自分で頑張るしかないんじゃないかな、って気がします。 例: http://answers.opencv.org/question/99998/getting-the-correct-frame-rate/ 上記例のanswer側でのコードは、waitKey()の精度すら信じておらず、 1ループ分に掛かった時間が1フレーム想定時間(time_to_wait) を超えるまで Win32 APIの Sleep()で待っています。 time_to_waitはget(CAP_PROP_FPS)で取得したfpsから算出していますが、 それでもこんなコードになるということは、 つまりCAP_PROP_FPSは(自分で画像取得フレームレートを制御するような用途には) 使えない、ってことではないかなと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問