- ベストアンサー
OpenCV webカメラ歪み補正について
- こちらのHPの「キャリブレーションデータを利用して,歪みを補正する」プログラムがうまくいかない理由
- Microsoft Visual Studio 2005でデバッグしたが何も起こらず、エラーも表示されない原因
- 「補正対象画像をコマンドライン引数で指定するプログラムなのでコマンドプロンプトから実行する」回答の意味
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
yama5140さんの言うとおり、実行の仕方に間違いがあります。そのソースコードでは main (int argc, char *argv[]) main関数に引数があるじゃないですか。これは、コマンドラインから引数をmain関数に渡せる、という意味なんです。このプログラムの場合これをしないとエラーになります。今ではWindowsOSが主流になり、アプリケーションはWindows上で実行されますが、昔のパソコンはMS-DOSというOSが主流でした。これは今のWindowsのようにグラフィカルではなく、文字列でプログラムやOSに指示を出すようなOSでした。現在MS-DOSは主流ではなくなったものの、まだこれを使いたいユーザーがいるため、MS-DOSはコマンドプロンプトというプログラム実行環境のプログラムとしてWindowsに残りました。これがMS-DOS。プログラム名を指定して実行で「cmd.exe」を実行して開けます。Windowsなら。開けたら、黒いウィンドウにC:\~~2>←こんなような文字が書いてあると思います。ウィンドウをクリックし、次のように打ち込みます。 (作ったプログラム名がtest.exeだった場合) test.exe "camera.xml" camera.xmlのところは補正したいxmlの絶対パスが相対パスを入れてください。test.exeがあるフォルダにcamera.xmlを入れたのなら↑を打ち込むんでOKです。打ち込んだらEnterを押します。これでできると思いますよ。こうやって渡す引数のことをコマンドライン引数といいます。argcはコマンドライン引数で渡された引数の数を格納する変数で、実際にユーザーがコマンドラインに指定して渡すのはargcの次からの引数になります。この場合はargv[]がコマンドライン引数として渡す引数です。 あなたが実行した時にどこで終了したかというと、 if (argc < 2 || (src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR)) == 0) return -1; ここでしょうね。 argc < 2 は、渡されたコマンドライン引数が2個より少なかったら || 論理ORで、どちらかが真なら真 (src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR)) == 0 は、cvLoadImageに受け取ったコマンドライン引数(=xmlファイル名)を指定して、そのxmlを開き、src_imgにcvLoadImag()から帰ってきたxmlの情報を入れる。画像が開けなくてcvLoadImag()から0が帰ってきます(エラーが出たら0を返すようにしてるんだと思います)。その返り値をsrc_imgにいれ、値を0と比較して(==0の部分)0が入っていたら、という意味です。 return -1 もし上記の条件文で、コマンドライン引数が多く渡されていたりコマンドライン引数が空だったりしたら真が返されるので、-1をreturnして不正終了を引き起こす。引数を渡していなかったので、ここで終了していた、というわけです。 これで、解決するといいのですが・・・。
その他の回答 (2)
- yama5140
- ベストアンサー率54% (136/250)
>エラーも表示されないので行き詰ってしまいました。 ソース10数行目の return -1; の1行を、下のように4行にしたら、エラーが表示されると思います。 { fprintf( stderr, "[%s] をオープン出来ない。\n", argv[1] ); return -1; } >「補正対象画像をコマンドライン引数で指定するプログラムなのでコマンドプロンプトから実行する」と回答をいただきましたが、よくわかりませんでした。 >この症状で考えられる原因はなんでしょうか? 1:実行ファイルは作成されたが、「正しく」起動しなかった、ことが考えられる。 2:各種 cv・・関数は、入力ファイル( camera.xml )が異常な場合、なんの処理・表示もせずプログラムは「正常」終了した、ことが考えられる。 「よくわかりませんでした」とあることから、1が原因と思います(上の修正・実行で判明します)。 --------------------------------------------------------- >Microsoft Visual Studio 2005でデバッグをしたのですが、 「サイトの一番上のプログラム」と「上から二番目のプログラム」は、同一のディレクトリにあるのでしょうか?。 無い場合は、「上から二番目のプログラム」の実行に際し、入力ファイルをフルパスで指定する必要があります。 または、事前に「上から二番目のプログラム」ディレクトリに、入力ファイルをコピーしておく必要があります。 ↑No.2 さんの方法での注意 --------------------------------------------------------- DOS窓(コマンドプロンプト)を開いて実行の方法。 C:\~~2>cvUndistort2.exe "C:\~~1\camera.xml" (Enter) ↑サイトの一番上のプログラムで作成済みファイル(コマンドライン引数) ↑上から二番目のプログラムをコンパイルしてできた実行ファイル(質問者様でのプログラム名を要充当) こうすることで、プログラム冒頭 main( int argc, char *argv[] ) この argv[1] に C:\~~1\camera.xml が引き渡されます。 注:~~の中に「空白」がある場合、引数は上のように "" で囲う必要があります。 なお、このためには、そもそも、 ・DOS窓を開くこと(「カレントディレクトリ」を確認)。 ・プログラム実行ファイルが、また、camera.xml がどのディレクトリにあるか。 ・「フルパス」で実行ファイル・入力ファイルを指定できること。 ・必要に応じて、カレントディレクトリ(ドライブ)を変更すること。 の基本的な知識を有し、操作できることが前提です。
- prophetok
- ベストアンサー率44% (13/29)
デバッグする上で基本中の基本なんだけどだけど、下記はやっている? プロジェクトのプロパティ コマンド引数に camera.xml を設定