現在、USB複数カメラのプログラムを開発して居ます。
問題は複数カメラを使用するとPICバスの帯域を越えてしまうので、フレームレートを低くしようとしていますが、うまく行って居ません。
調べた所、フレームレートを取得するのはAvgTimePerFrameがあり、こちらは実装出来てテストも終了して居ます。ただ、これは読み取り専用で書き込みが出来ません。
もう一つはGetOutputFPSで、これに対して書き込みにPutOutputFPSがあります。
この2つを実装したいと思っています。実装自体はLongSecret様のご助言で
一応出来ました。
下記のプログラムはフレームレートを読み出すプログラムで、前半はAvgTimePerFrameのものです。
関数の引数、Indexは現在使用しているカメラ、ロジクールC905Mの解像度23個のどれを選択しているかで、0から22が入って来ます。
AvgTimePerFrameの方はこのパラメーターに従って、選択した解像度のフレームレートを返して来ます。
(実際はレートでは無く、100nS単位のインターバル時間値ですが・・)
これに対して、後半のGetOutputFPSはどの解像度でも15FPSしか返しません。
もっとも、後半のプログラムはどの解像度を選択されているか関数に伝わって居ないと思われるので当然でしょうけど。
実はこのプログラムは先人が作成し、私が少しずつ分かる範囲で今回の様に改造を加えて来たもので、現在は相談する人も無く困っております。
AvgTimePerFrameの追加は何とか私でも出来たのですが、GetOutputFPSから選択した解像度に従ったフレームレートを出させる事は出来ないでしょうか。
若しくは他の方法で選択された解像度のフレームレートの入手、変更は出来ないでしょうか。
宜しくお願い致します。
int __fastcall TWebCam::RedFPS( int Index )
{
int iFrmSpd;
//分解能コントロール
IAMStreamConfig *pStreamConfig;
//キャプチャピンに対してストリームコングィグをセット
FCapture->FindInterface(&PIN_CATEGORY_CAPTURE, //キャプチャピン
0,//すべてのメディアタイプ
FVideoCap, IID_IAMStreamConfig, (void **)&pStreamConfig );
AM_MEDIA_TYPE *pmt;
VIDEO_STREAM_CONFIG_CAPS scc;
//フォーマットリストの取得
HRESULT hr;
// フォーマット機能の取得 機能番号はIndexに設定
hr=pStreamConfig->GetStreamCaps(Index,&pmt,(BYTE*)&scc);
if(hr!=S_OK){
ShowMessage("Format change error(1).");
return 0;
}
// フォーマットの設定
hr = pStreamConfig->SetFormat(pmt);
if(hr!=S_OK){
ShowMessage("Format change error(2).");
return 0;
}
VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)pmt->pbFormat;
// ビットマップ情報を BITMAPINFO 構造体にコピーする
// これはテスト用、今の所、選択されたカメラ、解像度番号のタイミングが入手出来ている様だ。
// 一方GetOutputFPSはどの解像度でも15が返ってくる。アクセス箇所位置が違う?
iFrmSpd = pVideoHeader->AvgTimePerFrame; // フレームタイミング入手
// ここからGetOutputFPS用のプログラム
IAMTimelineObj* pVideoGroupObj;
IAMTimeline* pTimeLine;
CoCreateInstance(CLSID_AMTimeline, NULL, CLSCTX_INPROC_SERVER,
IID_IAMTimeline, (void**)&pTimeLine);
pTimeLine->CreateEmptyNode(&pVideoGroupObj, TIMELINE_MAJOR_TYPE_GROUP);
IAMTimelineGroup* pVideoGroup;
pVideoGroupObj->QueryInterface(IID_IAMTimelineGroup, (void**)&pVideoGroup);
double dTmp;
pVideoGroup->GetOutputFPS(&dTmp); // 読み出しフレーム/秒
// pVideoGroup->GetOutputFPS(dTmp); // 書き込みフレーム/秒
pTimeLine->AddGroup( pVideoGroupObj );
pStreamConfig->Release();
return( (int) dTmp );
No.3ベストアンサー
- 回答日時:
いやまてよ
>問題は複数カメラを使用するとPICバスの帯域を越えてしまうので、フレームレートを低くしようとしていますが、うまく行って居ません。
ここなんですよね?
改めて名前と解説から考えると
IAMStreamConfig が気になります。
pStreamConfig->GetStreamCaps(Index,&pmt,(BYTE*)&scc);
で得たAM_MEDIA_TYPEを
hr = pStreamConfig->SetFormat(pmt);
するまえに
((VIDEOINFOHEADER*)pmt->pbFormat)->AvgTimePerFrame = 数値;
的なことをするとどうなるのでしょうか?
(関係ないかな?)
私としてはDirectShowもクラスの事もわからず、先人の物を引き継がされてしまっていますが、うちの部にはソフト屋さんは他に居ないので思い付いた事はやって見るだけです。
ありがとうございました。
No.5
- 回答日時:
>ところでLongSecretさん、Builderやdirectxの質問サイトご存知ありませんか?
私はC++関連については専らVisual C++ を使ってきたので、Builderについては分かりません。
ただ、C++についての質問サイトということであれば
Visual C++サイドのそれを利用しても、一応問題はないはずです。(C++ Builder使いながらMSDNのVC++のフォーラムで質問する、となると、ちょっとどうなのか分かりませんが…w ただ、そう言う点を除けばMSDNのVC++フォーラムとかは有力だとは思います。)
また、DirectXはBuilderでも対応してるのは間違いないと思いますが
Microsoft DirectXという名の通りMicrosoftが作ったAPIで、(全部は未確認ですが、おそらくManaged DirectXとか以外ネイティブな)C++で書かれているので
情報が充実している
といえば、その中でもC++コードを非常に簡単に扱える
同じくMicrosoftが作ったVisual C++関連のサイトに、必然的に落ち着いてくると思います。
単純に、C++の基本的なクラスの仕様を煮詰めたい場合であれば
C++関係の質問の場なら、ここでもMSDNのフォーラムでもYahoo知恵袋でも…
大抵の場所でなら教えてもらえるはずです。
あとは調べるときの「勘」とか「検索技術」は
実はかなり重要なポイントだったりするかもしれません。
色々ありがとうございました。
本日も色々試行錯誤していましたが、フレームレートの設定には至りませんでした。
とりあえずこちらの質問を締め切らせて頂きます。
もう一つの方は、今日の帰りがけにやって見たい事が出来てしまったので。来年、それを確認してから締め切ります。
No.4
- 回答日時:
>私としてはDirectShowもクラスの事もわからず、先人の物を引き継がされてしまっていますが、うちの部にはソフト屋さんは他に居ないので思い付いた事はやって見るだけです。
なかなか不憫な事でございますね。
とりあえず、私もちょろっとではありますが調べたことですので
下記内容を試してみて、出来るか出来ないかは教えていただけるとすっきりします(笑)
出来ないとしても各関数の戻り値などから活路が分かるかもしれませんし
DirectShow等も結局「誰かが作ったもの」で、型や関数の意味だけ知ってればいいし、実装部は見えない(或いは見る必要がない)という扱いになってるので
それぞれについて細かいことについて調べようとすれば、そのライブラリを作った人以外は、誰であっても
・ネットや書籍で調べる
・自分で実験してみる
・人に教わる
といった方法しかないはずです。
とはいえ、C++のclassの詳細が分かっていれば、見た目が見慣れない型名や関数名などで、ぱっと見「うわぁ」と思う事はあったりはしても、丁寧に見たり実験していくことで、それぞれの意味を必ず理解出来るようになるはずです。
時間が全くないならひとまずおいとくとしても
今後C++に触る可能性が0でないなら、classの仕様について、ある程度把握しておくとかなり良い、かもしれません。
深いところに突っ込みだすとキリがないですが、基本的にはCのstructが拡張されたものだとお考えください。
・Cのstructは、(表記上)変数だけで構成されていますが、C++のclassは、変数だけでなく関数もメンバに持っています。
・C++ではstructもclassも「継承」が可能です。
・Cのstructは、メンバに対して無制限にどこからでもアクセスできる(ため、意図しないところで書き換えられたりする危険がある)のですが、C++のclassやstructはアクセス修飾子、publicやprivate、あるいは継承先からのみ使用protectedを指定でき、どこからアクセスされるかを細かくコントロールできます。
・C++のstructとC++のclassは、なにもアクセス修飾子を書かない時のデフォルトが、前者はpublic、後者はprivateになっていて、それ以外は前方宣言の時にしっかり
class A;
struct B;
と、区別して書かないといけないといった細かいこと以外同じものです。
などなど。
>なかなか不憫な事でございますね。
そうなんですよね。カメラのIOは動くものとして、アプリケーションを組んで居たのに、カメラのIOの部分が仕様を満足しないから改造しないといけなく成るなんて。
私はクラスも分かりませんが、継承も漠然としか理解して居ないので大変です。
ところでLongSecretさん、Builderやdirectxの質問サイトご存知ありませんか?
もっともMSDNのフォーラム追いかけていったら英語のサイトに繋がってしまって、おまけに2008年辺りで交信が切れていたり。
ゲーム作成のサイトはにぎやかそうですが、やっている内容が全然分かりませんでした。
私レベルだとこのサイト位が一番いいんでしょうかね。
何度か画像処理は辞めたいと申告したんですが、却下されてしまい、今はやるしか無い状態です。
まぁ、今回の件は今までUSBカメラのキャプチャーに1~2秒かかって居たのが100mS程度でキャプチャー出来るので、現場が遅いプログラムでも何とか待つて居てくれていますが、原因が判ったので早く実装させたい機能です。
ぼやいてすみません。
No.1
- 回答日時:
こんばんは。
ハードが関連しそうなことはモノ(この場合Webカメラ)がないと把握が難しいので
相変わらず詳しいところは全く分かっていませんが
PutOutputFPSではなくSetOutputFPSではないでしょうか?
http://msdn.microsoft.com/ja-jp/library/cc355147 …
>もっとも、後半のプログラムはどの解像度を選択されているか関数に伝わって居ないと思われるので当然でしょうけど。
おっしゃるとおり、たぶん下の方は単純に、タイムラインってやつを生成したり
生成直後の状態をGetしたりしてる(?)
感じのコードに思いますし
// ここからGetOutputFPS用のプログラム
以降
pStreamConfig->Release();
の手前まで
上の部分で使った変数名が一個も出てこないのですが
とりあえず、下のほうの部分についてだけ
てきとーなコードでSetOutputFPSがS_OKを返してくる(成功する)ことは確認できました。
Debug::f(引数);
は単に、デバッグ簡単にするために使ってる自作関数です。
上述の通りS_OKを表示してくれました
IAMTimelineObj* obj;
IAMTimeline* tline;
CoCreateInstance(CLSID_AMTimeline, NULL, CLSCTX_INPROC_SERVER,
IID_IAMTimeline, (void**)&tline);
tline->CreateEmptyNode( &obj, TIMELINE_MAJOR_TYPE_GROUP );
IAMTimelineGroup* group;
obj->QueryInterface(IID_IAMTimelineGroup, (void**)&group);
double dTmp;
Debug::f( group->SetOutputFPS( 60.0 ) ); //現状よく分かってないので数値は適当です
tline->AddGroup( obj );
///つくったものは1対1の対応で全て解放をお忘れなく(DirectX(やCOM?)関連のインターフェースはRelease関数で解放というのが多いです。)///
obj->Release();
tline->Release();
group->Release();
///CoInitializeを呼び出したら、いつかはCoUninitializeするのをお忘れなく///
CoUninitialize();
あとは、AvgTimePerFrameのやつで、一致させられる
…ということでいいのかどうかは、ご確認ください。
こちらの問題もご回答頂いてありがとうございます。
>PutOutputFPSではなくSetOutputFPSではないでしょうか?
打ち間違いです。すみません。
>///CoInitializeを呼び出したら、いつかはCoUninitializeするのをお忘れなく///
はい、プログラムの開始と終了の所でやっています。
>上の部分で使った変数名が一個も出てこないのですが
そうなんです、どうやって関連付けて良いかわからなくて、今日半日MSDS等を見ていましたが、結局判りませんでした。
明日、家のPCで出来るかやってみます。そうで無ければ月曜までまって、会社のpCでやらざるを得ないのですが。
ここの所が解決すると、かなり処理が速く成るので何とかしたい所です。
自分のPCで出来て、何で現場のPCで出来ないのか長い間疑問でしたが、PCIバスの帯域らしい事が判ったら、今度は先人の作成したプログラムにはフレームレートの制御部分が無くて、八方ふさがりです。
兎に角、知識が無いので色々やって見るしかありません。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- 防犯カメラ・監視カメラ・小型カメラ Windowsのカメラ機能。設定した通りのfpsでの撮影ができず、コマ落ち動画になる。修正するには? 2 2023/01/29 09:50
- C言語・C++・C# C言語 3 2022/10/04 15:07
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Windows 10 再起動後 Pinが使用できず、PC(windows11)にサインインできない 3 2022/08/30 20:53
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンソールアプリでファイル選...
-
Perlで複数ファイルをアップロ...
-
API、OCX、DLLって何でしょう?
-
Ryzen 3700(無印)はWin11に対応...
-
UNIX環境でのCプログラム上でC...
-
プログラム解析について
-
初心者にEXCELのVBAを教えると...
-
機能拡張しやすいプログラムの...
-
OSとCPUの関係について
-
Visual Basic と VC++ のちが...
-
SNMPトラップ情報をC#.netで作...
-
VBプログラムをEXCEL VBAに移植...
-
ランチャーの作り方について教...
-
三目並べ
-
VB2005の自作ブログラムをWin10...
-
1年無職の彼氏 別れるべきですか?
-
機械工学専攻の院卒でSEになる...
-
nslookupするとローカルドメイ...
-
【HP作成】クリック音が鳴るよ...
-
一つのページに複数の URL を持...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
API、OCX、DLLって何でしょう?
-
VBプログラムをEXCEL VBAに移植...
-
Ryzen 3700(無印)はWin11に対応...
-
VBS:コンピュータ名を取得し、...
-
コンソールアプリでファイル選...
-
C言語プログラミング 逆行列を...
-
VB2005の自作ブログラムをWin10...
-
CoInitializeSecurityが失敗する
-
OSとCPUの関係について
-
Perl5とActivePerl
-
Java言語を使ったP2Pのチャット...
-
バージョンのつけ方
-
VB.net エラーメッセージを英文...
-
プログラミング 素数か素数では...
-
SNMPトラップ情報をC#.netで作...
-
このプログラミング誰か教えて...
-
FORTRAN でプログレスバーを作る
-
ランチャーの作り方について教...
-
PHP+MySQLで家計簿を作りたい
-
サイクロイドの軌跡
おすすめ情報