OpenCVでカメラのFPSが設定できません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
めがねにく

OpenCVでカメラのFPSが設定できません

#1

投稿記事 by めがねにく » 8年前

OpenCVでカメラのFPSが設定できません。どうやったらできるのでしょうか。
cap.set(CV_CAP_PROP_FPS,1);
と記述したのですがFPSが1にならないようです。なぜでしょうか

Egg

Re: OpenCVでカメラのFPSが設定できません

#2

投稿記事 by Egg » 8年前

せめて以下の項目ぐらいは記述してもらわないと答えようがないです。

使用している言語:
OpenCVのバージョン:

C6b14

Re: OpenCVでカメラのFPSが設定できません

#3

投稿記事 by C6b14 » 8年前

C++ OpenCV3.1 ですが このコード で動いてます。

コード:

#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp> // videoioのヘッダーをインクルード
#include <opencv2/highgui.hpp> // highguiのヘッダーをインクルード
#include <iostream>

int main(int argc, const char* argv[])
{
	// (1)DirectShowを使ってカメラキャプチャを行う。

	// また、カメラIDが0番のカメラについてキャプチャの準備を行う
	int camera_id = 0;

	cv::VideoCapture cap(cv::CAP_DSHOW + camera_id);

	// (2)カメラIDが0番のカメラが正しくオープンできているかをチェックする
	//(正しくオープンできていなければエラー終了する)
	if (!cap.isOpened())
		return -1;

	// (3)カメラキャプチャのフレームレートを30.0に指定する
	cap.set(cv::CAP_PROP_FPS, 30.0);

	// 画像表示用のウィンドウを生成する
	cv::namedWindow("image", cv::WINDOW_AUTOSIZE);

	// 画像データを格納するための変数を宣言する
	cv::Mat frame;

	for (;;)

	{
		// (4)カメラから1フレーム分の画像データを取得して、変数frameに格納する
		cap >> frame;

		// 画像データ取得に失敗したらループを抜ける
		if (frame.empty()) break;

		// 取得した画像データをウィンドウ表示する
		cv::imshow("image", frame);

		if (cv::waitKey(30) >= 0) break;
	}
	return 0;
}
cap.set(CV_CAP_PROP_FPS,1); は 値が 間違って いませんか。

めがねにく

Re: OpenCVでカメラのFPSが設定できません

#4

投稿記事 by めがねにく » 8年前

ご返信ご検証ありがとうございます
OSはUbuntuでopencvはC++のver3.1.0を使用しています
以下のコードを記述すればカメラから得られる動画像は1FPSになってカクカクな映像が表示されると踏んでいたのですが
滑らかな映像で表示されます(体感40FPS以上?)
何故こうなるのか見当もつきません
ご教授の程よろしくお願いします

コード:

#include <opencv2/core/core.hpp>
#include <opencv2/video/video.hpp>
#include <opencv2/highgui/highgui.hpp> 
#include <iostream>

int main(int argc, const char* argv[]){

  cv::VideoCapture cap(0);

  if (!cap.isOpened())
    return -1;

  cap.set(CV_CAP_PROP_FPS,1);

  cv::namedWindow("image", cv::WINDOW_AUTOSIZE);

  cv::Mat frame;

  while(1){
    cap >> frame;

    if (frame.empty()) break;

    cv::imshow("image", frame);

    if (cv::waitKey(30) >= 0) break;
  }
  return 0;
}

C6b14

Re: OpenCVでカメラのFPSが設定できません

#5

投稿記事 by C6b14 » 8年前

単純に 待ち時間 を 900 以上 にして 調整してみてください。
30fps だと 1000 ミリ秒 わる 30 で 33 msec なので
waitKey(30) かな という 気がします。

C6b14

Re: OpenCVでカメラのFPSが設定できません

#6

投稿記事 by C6b14 » 8年前

http://13mzawa2.hateblo.jp/entry/2015/12/28/180021 いま、よんでるとこるですが。関係あるかもしれません?

C6b14

Re: OpenCVでカメラのFPSが設定できません

#7

投稿記事 by C6b14 » 8年前

試して見たら いいみたいです。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: OpenCVでカメラのFPSが設定できません

#8

投稿記事 by usao » 8年前

オフトピック
>何故こうなるのか

CV_CAP_PROP_FPS
等の設定が効かないというのは経験があります.

CVが中でどうやってそれを実現しようとするのか仕組みはわかりませんので,正確な理由は私は知りませんが,
例えば,単にカメラ自体にそう動けという設定をする形になっているのであれば,
カメラ側がそのような動作モードみたいなのをサポートしていなければ無理だろうな,とか想像はできます.

C6b14さんがおっしゃっているように,自前でフレーム画像を取得するタイミングを調整する方向ではダメなのでしょうか?
”1FPS”に対する要求精度がとても高いのでしょうか?

C6b14

Re: OpenCVでカメラのFPSが設定できません

#9

投稿記事 by C6b14 » 8年前

[ OpenCVでカメラのFPSを設定するには? CV_CAP_PROP_FPSは偽物です ] という 情報があって
”highgui / cap_v4l.cppには実装が存在しないため ”  と ありますが。( ちょっと前の情報です )

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: OpenCVでカメラのFPSが設定できません

#10

投稿記事 by usao » 8年前

とりあえず,まず
cap.set(CV_CAP_PROP_FPS,1);
の戻り値をチェックしてはどうでしょうか.
設定不能であれば,falseが返ってるのではないかと.

C6b14

Re: OpenCVでカメラのFPSが設定できません

#11

投稿記事 by C6b14 » 8年前

なるほど、私のPCでは1(true)が返るので,カメラの機種情報が分からないと調べようがないですね。
[ OpenCVでカメラのFPSを設定するには? CV_CAP_PROP_FPSは偽物です ] というのはここhttp://stackoverflow.com/questions/7039 ... -is-a-fakeの翻訳を見たのだと思います。注意して見ると
Worked for me for OpenCV 3.0.0 on Ubuntu 12.04. After
installing libv4l-dev, I reran my original cmake
(WITH_LIBV4L was enabled by default) and linking worked
without any change to make. Getting and setting

CV_CAP_PROP_FPS now works for my LifeCam Cinemas. – Ulrich Stern Aug 19 '15 at 14:36
とあるのでいまはカメラによっては正しく動いているようです。 
読んでみると海外の皆さんもOpenCVの組織に問い合わせて苦労してるようです。(私のPCないのコードのopencvのincludeには該当する箇所がみつからずhttps://fossies.org/diffs/opencv/2.4.11 ... -diff.htmlなどを眺めてました。おかげで勉強になりました。)

めがねにく

Re: OpenCVでカメラのFPSが設定できません

#12

投稿記事 by めがねにく » 8年前

cap.get(CV_CAP_PROP_FPS);とcap.set(CV_CAP_PROP_FPS);の戻り値が共に-1になってしまうのを確認しました
(cap.get(CV_CAP_PROP_FRAME_WIDTH)の戻り値はちゃんと出るのになんで...... ;_; )

なのでwhileの中で経過時間を測定してFPSを調整する方法を試してみます

閉鎖

“C言語何でも質問掲示板” へ戻る