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

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

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

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

C++

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

Q&A

解決済

2回答

3463閲覧

opencvを用いた自動撮影

yamata

総合スコア36

OpenCV

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

C++

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

0グッド

0クリップ

投稿2016/06/22 05:33

編集2016/06/22 06:33

opencvを用いて、USBカメラから、1秒間に30フレームの自動撮影を行おうとしています。

しかし、プログラム初心者な為うまくいきません。

以下にプログラムを示しますが、sとcキーを押しても何も反応がありません。
また、qキーを押すと終了しますが、printfも表示されません。

訂正箇所や新しい方法を教えていただきたいと考えています。

include部分は省略します。

動作環境は、
opencv2.4.9、vc++2010Expressを使用しています。

int main( int argc, char** argv )
{
int key; // キー入力用変数
int counter = 0;
CvCapture *capture; // キャプチャ用構造体
IplImage *frameImage; // キャプチャ画像用IplImage
char str[32];
char windowNameCapture[] = "Capture"; // ウィンドウネーム
DWORD dwCurrentTime = 0; // 追加
DWORD dwLastTime = ::timeGetTime(); // 追加
BOOL bCapture = FALSE; // 追加

// タイマ精度を1msにする ::timeBeginPeriod(1); // 追加 // カメラの初期化 if( ( capture = cvCreateCameraCapture(-1)) == NULL) { // カメラデバイスが検出できない場合 printf("カメラデバイスを検出できません\n"); return -1; } // ウィンドウ生成 cvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE ); // メインループ while ( 1 ) { // カメラから1フレームをframeImageに格納 frameImage = cvQueryFrame( capture ); printf("フレームの問い合わせ\n"); // 画像表示 cvShowImage( windowNameCapture, frameImage ); printf("フレームの描画中\n"); key = cvWaitKey(0); // 静止撮影ボタンが押された if(key =='c') { sprintf_s( str, "testview%04d.bmp", counter++ ); cvSaveImage( str, frameImage ); } // 録画ボタンが押された else if(key == 's') { // トグルする bCapture ^=TRUE; ::printf("%s\n", bCapture?"録画開始":"録画停止"); // キャプチャーの開始を命じられたので開始時刻を取得 if(bCapture) { dwCurrentTime = dwLastTime = ::timeGetTime(); } } // 'q'キーが入力されたらループを抜ける else if(key == 'q') { printf("終了します\n"); break; } //キャプチャーしていないので引き返す if(!bCapture) { continue; } // 最新時間を取得 dwCurrentTime = ::timeGetTime(); // 経過時間がレートに満たないので引き返す if(dwCurrentTime - dwLastTime <= 30) { continue; } // 現在のタイムを最新のタイムにする dwLastTime = dwCurrentTime; // 保存 sprintf_s( str, "testsview%04d.bmp", counter++ ); cvSaveImage( str, frameImage ); printf("%s\n", str); } // キャプチャ解放 cvReleaseCapture( &capture ); // ウィンドウ破棄 cvDestroyWindow( windowNameCapture ); return 0;

}

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

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

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

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

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

ozwk

2016/06/22 05:35

タグのC#は何か関係あります?
yamata

2016/06/22 05:41

申し訳ございません。省きました。 よろしくお願い致します。
T.Kanno

2016/06/22 06:29

OpenCV のバージョンや動作環境も書いた方が良いと思います。
yamata

2016/06/22 06:33

ご指摘ありがとうございます。 追加しました。
guest

回答2

0

ベストアンサー

カメラでキャプチャーはしていませんが、実際に動かしてみました。
'S' 'C'にも反応し、if文の中に入れました。
既に実施されているのなら申し訳ないですが、breakをかけてデバッグされていますでしょうか?
bmpファイルが保存されないので、上手くいっていないと言われているのでしょうか?

投稿2016/06/22 09:43

eleanor2352011

総合スコア44

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

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

yamata

2016/06/22 09:50

申し訳ございません。 breakをかけてデバッグとはどのような意味でしょうか? ファイルが保存されないため、sとcキーが押されていないと判断しました。 ファイルが保存されないので上手くいかないという考えは間違いなのでしょうか?
eleanor2352011

2016/06/22 10:08

私のvcとバージョンが違うので ショートカットが違ったらすみません。 s cが押されたときに入るif分の中にカーソルを合わせてF9を押してください。 そうすると、ソースの左側に赤○が着きます。 これをbreakポイントと言います。 その後F5でプログラム実行します。 今まで通り、sまたはcを押し breakポイントで、プログラムが停止すれば、キーには反応していることになります。 問題は 画像保存できない→キーに反応していない。 ではなく ただ、画像保存できない かと思います。 とりあえず、保存の所は フルパス入れてみてはどうでしょうか? フルパスとは ドライブ名から全部入力することです。
yamata

2016/06/23 02:58

バイナリはデバッグ情報と一緒にビルドされませんでした。 というのがでて、プログラムが停止することはありませんでした。 申し訳ございません。やり方がわからないため、Cドライブに保存する場合の 方法を教えていただけたらと思います。
yamata

2016/06/23 03:08

何度もすいません。 Cannot find or open the PDB file このような文も出るのですが、こちらは、デバックなしで開始をすることで 無視していいのでしょうか?
eleanor2352011

2016/06/23 04:13

Releaseモードになっていますでしょうか。 メニュー>ビルド>構成マネージャーを選択 「Release」となっている箇所があると思います。 そこを「Debug」に変えればbreakが使用できるようになります。 それはさておき、Cドライブへは testview%04d.bmp を C:\\test\\testview%04d.bmp と変えてみてはどうでしょうか。 おそらくCドライブ直下には保存できないと思いますので testというフォルダを予めご自身で作ってくださいね。
eleanor2352011

2016/06/23 04:14

Cannot find or open the PDB file 私の環境でも大量にでますが、無視してます。。。
eleanor2352011

2016/06/23 04:39

どこかの共用パソコンをお使いで、Cドライブにファイルを作成する権限が そもそも無いということはないですよね?
yamata

2016/06/23 05:00

自分のパソコンを使っているので、そのようなことはないと考えています。
guest

0

まず、プログラムはどのように起動していますでしょうか?

printf の結果は、GUI からクリックして起動すると出なかったような気がします。

term なり DOSプロンプトなりで、コマンド名を叩いて起動してみたら、生成したウインドウではなく
起動したターミナル画面に表示されませんか?

投稿2016/06/22 06:40

T.Kanno

総合スコア915

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

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

yamata

2016/06/22 06:49

ありがとうございます。 Captureにカメラ画面がずっと表示されるだけです。 qキーを押すと終了するだけの状態です。 printfの結果が表示されないのはわかりました。 しかし、その後が初心者な為、よくわかりません、 ptrintfの結果が表示されなくてもいいので、 1秒間に30フレームの写真を撮影するのは無理なのでしょうか?
T.Kanno

2016/06/22 07:13

コマンドプロンプトを開いて、cd で作ったプログラムのあるフォルダに移動して、コマンド名を叩いて起動したら、新たに表示される画像ウインドウではなく、コマンドプロンプトのウインドウに表示されると思います。 あと、カメラの解像度がよく解らないんですけど、リアルタイムに全フレームをキャプチャして静止画として保存するのはHDDなりの二次記憶の伝送容量的に行けるんでしょうか? フルHDでピクセル当たり4バイトの静止画を毎秒30フレーム保存することを考えると、 1920x1080x4x30 -> 248832000 -> 約250MB/s になりますけど… これって、今どきの SSDでもきつくないですか?
yamata

2016/06/22 07:26

申し訳ございません。cdで作ったの意味が分かりません。 知識がなくすいません。 試してから考えてみたいと思っています。30フレームは理想なので、最初は1フレームからでも始めてみたいと考えています。 気になったことなのですが、私のプログラムは、CLRコンソールアプリケーションで動作確認する必要があるのでしょうか?気になったので教えていただけると嬉しいです。
T.Kanno

2016/06/22 07:42

cd はコマンドプロンプト内で入力実行することのできるコマンドの一つなんですが、一から使い方を覚えるのは障壁が高いかもしれません。ただ、printf でデバッグする場合は、アプリをコンソールアプリケーションで作って、コマンドプロンプトから実行することになると思います。 CLRコンソールアプリケーションについては、よく解りません。自分は、Win32コンソールアプリケーションを VS2013 で作っていましたので、とりあえず必須ではないと思いますが、コンソールアプリとして作っておかないと printf が効かないと思います。
yamata

2016/06/22 07:58

printfについてはもう少し勉強したいと思います。 コンソールアプリケーションの作り方を教えていただけたらと思います。 printfができていないためにcとsキーが動かないのでしょうか? それとも他に原因があるのでしょうか?
T.Kanno

2016/06/22 23:45

VS2010 でも、この辺は同じかと思いますが、最初のプロジェクトを作るところで、Win32コンソールアプリケーションを選択すればできると思います。 また、ちゃんと終了することから、メインループはおそらくまわっていて、printf が直接の原因ではないと思います。 printf を機能させるなり、デバッガなりで動作を追ってみるとよいでしょう。
yamata

2016/06/23 02:59

ありがとうございます。 もう少し頑張ってみようと思います。 なにか改善方法がでれば、また、お願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問