OpenCVについて

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

OpenCVについて

#1

投稿記事 by DenDen » 15年前

いま、OpenCVの勉強を自分でしていて、オライリーの詳解OpenCVというものをやっているのですが、その中のプログラムの中にこのようなものがあります
AVIファイルを流してみようという簡単なプログラムです
#include "highgui.h"
#include <stdio.h>

int main(int argc , char** argv){
    cvNamedWindow( "Example2", CV_WINDOW_AUTOSIZE);
    CvCapture* capture = cvCreateFileCapture( argv[1] );
    IplImage* frame;
    char key;

    while(1){
        frame = cvQueryFrame( capture );
        if(!frame){
            break;
        }
        cvShowImage("Example2" , frame);
        key = cvWaitKey(10);
        if(key ='q'){
            break;
        }
    }
    cvReleaseCapture( &capture);
    cvDestroyWindow("Example2");
}

ところが、実際にこれを書き込んで実行してみると、argv[1]がうまく動かずファイルの名前を入力できず、プログラムが終了してしまいます。なぜこのようになってしまうのか自分で考えてみたのですが、どうもうまくいきません。プログラム自体に間違いはなさそうですし、対策としてcharに代入してから引数に入れるという方法を取ってみたりしましたができませんでした。


まだプログラムを初めて二年弱の人間なので、もしかしたら当たり前のことを普通に間違えているのかもしれませんが、そこらへんは許して下さい

開発環境はwindows vistaでVC++2008を使ってます

OpenCVなんぞ場違いだとは思いますが、相談できる心当たりはここにしかなく相談しました
申し訳ないとは思いますが、どうぞよろしくお願いします!

last snow

Re:OpenCVについて

#2

投稿記事 by last snow » 15年前

ポインタと配列の違いはご存知ですか?
なぜ、charのポインタのポインタ形であるargvを引数で渡しているのに、配列参照しているのでしょうか。


また、
>argv[1]がうまく動かずファイルの名前を入力できず
とありますがopenCVリファレンスでは、

<hr>

cvCreateFileCapture

ファイルからのビデオキャプチャを初期化する

CvCapture* cvCreateFileCapture( const char* filename );

filename
ビデオファイル名.

関数 cvCreateFileCapture は, 指定されたファイルからビデオストリームを読み込むために CvCapture 構造体を確保して初期化する.

確保された構造体が使用されなくなったときには,関数 cvReleaseCaptureによって解放されるべきである.

<hr>

とあります。
何処でcvCreateFileCapture関数に渡すべきファイル名を入力しているのでしょうか? 画像

Mist

Re:OpenCVについて

#3

投稿記事 by Mist » 15年前

> 何処でcvCreateFileCapture関数に渡すべきファイル名を入力しているのでしょうか?

OpenCVはわかんないけど、コマンドプロンプトから

> xxx.exe "(ファイルパス\ファイル名)"

として実行しているならDenDenさんのソースに間違いは無いよ。
ただ、VC上から実行する場合、コマンドライン引数はプロパティで設定する必要があるので、それがきちんとできているかは気になる。

※VCでのコマンドライン引数の設定
メニューから「プロジェクト」→「(プロジェクト名)のプロパティ」を選択。
ツリーから「構成プロパティ」→「デバッグ」を選択。
右側の「コマンドライン引数」欄に引数として渡すデータを入力。

> ポインタと配列の違いはご存知ですか?
> なぜ、charのポインタのポインタ形であるargvを引数で渡しているのに、配列参照しているのでしょうか。
この指摘は間違い。
char** argv

char *argv[/url]
と同じだからargv[1]と書いてることになんら問題は無い。
逆に、ダメだと考えた理由を説明して欲しい。

DenDen

Re:OpenCVについて

#4

投稿記事 by DenDen » 15年前

last snowさん、Mistさん 解答ありがとうございます。
Mistさんの言うとおりVC++で事項しているので、コマンドライン引数が書かれていなかったようです。

申し訳ないのですが、ソースファイルと同じ階層にOpenCV.aviというファイルを入れているのですが、コマンドライン引数にOpenCV.aviと入れても実行ができません。
もうしわけないのですがどう書けばいいのでしょうか?
よろしければ教えていただけないでしょうか?

Mist

Re:OpenCVについて

#5

投稿記事 by Mist » 15年前

> もうしわけないのですがどう書けばいいのでしょうか?
まず、動画ファイルの名前がプログラムに対して正しく渡されているかと、動画が再生できないことは分けて考えてください。
コマンドライン引数については回答できますがOpenCVについては経験が無いので私は回答できません。

main関数の最初に
printf("%s\n", argv[1]);
を追加して、ファイル名が正しく渡されていることを確認してください。
これでOpenCV.aviと表示されるのであればコマンドライン引数の使い方はあっています。
よって、問題はファイル名以外となりますのでOpenCVに詳しい回答者を待ってください。

last snow

Re:OpenCVについて

#6

投稿記事 by last snow » 15年前

>mistさん
>この指摘は間違い。
ご指摘痛み入ります。
確かに出来ますよね……私の間違いです。
勘違いしていました。

>dendenさん
ポインタのポインタに関して間違った指摘をしてしまい申し訳ありません。
心よりお詫び申し上げます。

>もうしわけないのですがどう書けばいいのでしょうか?
openGVに詳しい、という訳でないので一概に答えられませんが、ブレークポイントをMAIN関数内で多数設置し、処理を追いつつウォッチリストで変数の値を追っていけば何か解るかもしれません。

また、モノは試しですが、ファイル名のコマンドライン引数を、フルパスで参照してみるとかはどうでしょうか?
画像

Mist

Re:OpenCVについて

#7

投稿記事 by Mist » 15年前

avi再生のソース見つけました。
こっちのほうがエラー処理も入っているから何が問題なのかわかるんじゃないですか。

http://wiki.livedoor.jp/mikk_ni3_92/d/O ... A%C6%C0%B8

DenDen

Re:OpenCVについて

#8

投稿記事 by DenDen » 15年前

返事が遅れて申し訳ありませんでした
aviファイルが開けないのが原因みたいです
リンク先を参考にして頑張っていこうと思います
Mistさん、last Snowさん ありがとうございました!

閉鎖

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