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

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

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

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

C++

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

teratail

teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

Q&A

解決済

2回答

3240閲覧

OpenCV3.1のsample stereo_calib.cppの実行エラーの解決方法を教えてください

hafis

総合スコア23

OpenCV

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

C++

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

teratail

teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

1グッド

1クリップ

投稿2016/07/12 03:19

編集2016/07/19 08:33

環境はWindow7、visualstdio2015Enterprise x64、OpenCV3.1,
OpenCVのsamplesディレクトリ内にあるstereo_calib.cppを実行させたところエラーになります。

実行をすると
cameraMatrix[0] = initCameraMatrix2D(objectPoints, imagePoints[0], imageSize, 0.0);で
Unhandled exception at 0x000007FEFD16A06D in ConsoleApplication1.exe: Microsoft C++ exception: cv::Exception at memory location 0x00000000002CAD80.
とvisualstdioの画面にエラーが表示されます。
またコンソールにも
OpenCV Error:Assertion failed(nimages>0 && nimages == (int)imagePoint1.tota
l() && (!imgPtMat2 || nimages == (int)imagePoint2.total()) in cv::collectCalib
rationData, file C: \buildslave64\win64_amdoc|\master_PackSlave-win64-vc14-shared
\opencv\modules\calib3d\src\calibration.cpp, line 3054
と表示されます。

static void
StereoCalib(const vector<string>& imagelist, Size boardSize, bool displayCorners = false, bool useCalibrated = true, bool showRectified = true)

の引数はimagelist, boardSize, true, true, true
imagelistはC:/work/left01.jpg,C:/work/right01.jpg・・・・でxmlファイルから読んでいます。
boardSizeはwidth=9,height=6です。

実行方法はVisualStdioでDebugに設定してLocal Window Debuggerを押して実行しています。

drawChessboardCornersで画像を出力してコーナーを検出しているのを確認しています。

サンプルを修正した点は
実行をするとコマンドライン引数の入力を待たずソフトが走ってしまうため サンプルを
cv::CommandLineParser parser(argc, argv, "{w|9|}{h|6|}{nr||}{help||}{@input|C:/work/stereo_calib.xml|}");

StereoCalib(imagelist, boardSize, true, true, true);
を変更しました。

コードをサンプルへ戻しました。
stereo_calib.xmlファイルの中は

<?xml version="1.0"?>

<opencv_storage>
<imagelist>
"C:/work/left01.jpg"
"C:/work/right01.jpg"
"C:/work/left02.jpg"
"C:/work/right02.jpg"
"C:/work/left03.jpg"
"C:/work/right03.jpg"
"C:/work/left04.jpg"
"C:/work/right04.jpg"
"C:/work/left05.jpg"
"C:/work/right05.jpg"
"C:/work/left06.jpg"
"C:/work/right06.jpg"
"C:/work/left07.jpg"
"C:/work/right07.jpg"
"C:/work/left08.jpg"
"C:/work/right08.jpg"
"C:/work/left09.jpg"
"C:/work/right09.jpg"
"C:/work/left11.jpg"
"C:/work/right11.jpg"
"C:/work/left12.jpg"
"C:/work/right12.jpg"
"C:/work/left13.jpg"
"C:/work/right13.jpg"
"C:/work/left14.jpg"
"C:/work/right14.jpg"
</imagelist>
</opencv_storage>

です。

work 内のファイルは
"left01.jpg"
"right01.jpg"
"left02.jpg"
"right02.jpg"
"left03.jpg"
"right03.jpg"
"left04.jpg"
"right04.jpg"
"left05.jpg"
"right05.jpg"
"left06.jpg"
"right06.jpg"
"left07.jpg"
"right07.jpg"
"left08.jpg"
"right08.jpg"
"left09.jpg"
"right09.jpg"
"left11.jpg"
"right11.jpg"
"left12.jpg"
"right12.jpg"
"left13.jpg"
"right13.jpg"
"left14.jpg"
"right14.jpg"
と”stereo_calib.xml”
です。

画像ファイルはOpenCVのサンプルで用意されたものを使っています。

エラーは一番最初のforのループ内で発生します。
http://whitecats.dip.jp/up/download/1468892458.zip/attach
へプロジェクトフォルダをアップしました。
パスワードは0000です。

どうかよろしくお願いいたします。

mondaminZ👍を押しています

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

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

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

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

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

yuki23

2016/07/12 13:12

・長々と書いてますが、要は opencv の samples ディレクトリ内にある stereo_calib.cpp のことですか? ・どのように実行されていますか? 引数などには何を指定していますか?
hafis

2016/07/13 00:16

質問へ対応していただきありがとうございます。 現状を説明いたします。 環境はWindow7、visualstdio2015Enterprise x64、OpenCV3.1, OpenCVのsamplesディレクトリ内にあるstereo_calib.cppを実行させたところエラーになります。 実行をすると cameraMatrix[0] = initCameraMatrix2D(objectPoints, imagePoints[0], imageSize, 0.0);で Unhandled exception at 0x000007FEFD16A06D in ConsoleApplication1.exe: Microsoft C++ exception: cv::Exception at memory location 0x00000000002CAD80. とエラーが表示されます。 static void StereoCalib(const vector<string>& imagelist, Size boardSize, bool displayCorners = false, bool useCalibrated = true, bool showRectified = true) の引数はimagelist, boardSize, true, true, true imagelistはC:/work/left01.jpg,C:/work/right01.jpg・・・・でxmlファイルから読んでいます。 boardSizeはwidth=9,height=6です。 実行方法はVisualStdioでDebugに設定してLocal Window Debuggerを押して実行しています。 他にimagelistのアドレスが長いとエラーなります。 またobjectPoints.resize(nimages);でもエラーが出たため 配置位置を先頭付近へ変えたらエラーがでなくなりました。 どうかよろしくお願いいたします。
yuki23

2016/07/13 11:24

・サンプルに何か手を加えたのですか? であれば、それを具体的に教えて下さい。私の環境ではサンプルそのままの状態で正常に動作しています。・実行方法はそういうことを聞いているのではありません。このサンプルは、コマンドライン引数に XML ファイルを指定するはずです。コマンドライン引数の内容、XMLファイルの内容、XMLファイルで指定した画像ファイルの内容を教えて下さい。
hafis

2016/07/13 23:57

対応ありがとうございます。 実行をするとコマンドライン引数の入力を待たずソフトが走ってしまうため サンプルを  cv::CommandLineParser parser(argc, argv, "{w|9|}{h|6|}{nr||}{help||}{@input|C:/work/stereo_calib.xml|}");  StereoCalib(imagelist, boardSize, true, true, true); としました。 XMLファイルの内容はアドレス文字列が長いとエラーが出たため <?xml version="1.0"?> <opencv_storage> <imagelist> "C:/work/left01.jpg" "C:/work/right01.jpg" "C:/work/left02.jpg" "C:/work/right02.jpg" "C:/work/left03.jpg" "C:/work/right03.jpg" ・ ・ ・ "C:/work/left14.jpg" "C:/work/right14.jpg" </imagelist> </opencv_storage> としました。 コマンドライン引数の入力を待つにはどうしたら良いのでしょうか。  
hafis

2016/07/14 01:14

度々申し訳ありません。 コードを元のサンプルへ戻し プロジェクト→プロパティ→デバッグ→コマンド引数の欄に c:/work/stereo_calib.xml と入力して実行しましたが goodImageList.push_back(imagelist[i * 2]); のところで10回目のループでエラーが出てしまいます。 XMLファイルの中は画像の”left01.jpg”となっていたものを "C:/work/left01.jpg"へとそれぞれ変更しました。 画像はC:/work/の中です。 コマンドライン引数の扱い方、XMLファイルの書き方など 教えていただけないでしょうか。 どうかよろしお願いいたします。
hafis

2016/07/14 02:29

何度も申し訳ありません。 コマンドプロンプトを起動して streo_calib.exe c:/work/stereo_calib.xmlで実行しましたが 10回目のループの時にエラーが出てしまいます。 何度も申し訳ありません。
yuki23

2016/07/15 11:45

使い方には問題ないように思います。一字一句同じようにしているつもりですが、こちらでは再現していませんね。正直、さっぱりわかりません。最後に念のため、xmlファイルの内容を「省略せずに」教えていただけますか? もしくはどこかにアップロードできますか?(できれば Visual Studio のプロジェクトフォルダを丸ごと)
yuki23

2016/07/15 11:49

ついでに、C:\work フォルダに有るファイルの一覧も、省略せずに教えていただけますか?
guest

回答2

0

ベストアンサー

プロジェクトファイルを見てやっとわかりました。最初からそう聞けばよかったですね。

原因は、opencv_world310.lib と opencv_world310d.lib を同時にリンクしていることです。
opencv_world310.lib は Release ビルド、opencv_world310d.lib は Debug ビルドの時にだけリンクします。違う構成のビルドにリンクしてはいけません。
プロジェクトの構成から、Debug の設定から opencv_world310.lib を外し、Release の構成に opencv_world310.lib を移動してください。

投稿2016/07/19 12:54

yuki23

総合スコア1448

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

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

0

こんにちは。

回答依頼を頂きましたので、来ました。
実は、既に何回か見ていたのですが、解が分からなかったので回答できませんでした。
今も解はわからないのです。

さて、このようなケースでは3つ原因が考えられます。

①プログラムの修正ミス
②入力ミス
③そもそもサンプルが動作しない

もし、プログラムを修正されていないようでしたら、入力に失敗しているケースが少なくないです。
imread()で読み出せている画像が適切か、OpenCVでウィンドウを開いて表示してみる、bmpファイルへ保存してみるなどして確認して見てください。
画像がちゃんと読めている場合、その画像の中身が適切か確認が必要です。
グレス・スケールになっているか、ちゃんとチェッカー画像が取れているか、適切に検出できているかなどです。

これらが全てOKなら、③が疑わしいです。
OpenCV 2.4.10 の stereo_calib.cpp を自分のカメラ画像でやってみた1の人は2.4.1ですが、同じサンプルを動かそうとしてなかなか成功していないようです。
もし、その場合は、デバッグするしかないです。
申し訳ないですが、とてもそこまでお手伝いすることはできません。

投稿2016/07/13 04:29

Chironian

総合スコア23272

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

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

hafis

2016/07/13 05:09

回答ありがとうございます。 チェカー画像の確認とコーナーの検出確認はしました。 ①のいくつか修正した部分があるので確認したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問