0

最初は、WinXp の Visual 2008 で OpenCV 2.4.2 を使用しています。問題は次のとおりです。

imwrite次のプロトタイプを持つグレーレベルの画像を書き込む関数を使用しています。

bool imwrite( const string& filename, InputArray img, const vector<int>& params=vector<int>());

画像タイプは事前にチェックして設定します(8bit、1チャンネル)。ただし、リリース モードでのみ例外が発生し (エラー -2、指定された拡張子のライターが見つかりませんでした)、私の場合は bmp イメージを書き込みます.\Images\Debug\calibration_ref.bmp。このファイル名の何が問題なのかわかりませんでした。

ヒント

dll ソース ファイル (opencv_highgui242d.dll、loadsave.cpp、l.298) を詳しく調べたところconst std::string & filename<Bad Ptr>. この結果を得るために、私はリリース モードで highgui デバッグ バージョンの dll を使用しました。すべての引数が破損していると思われます。

手がかり2

この腐敗がどこから来たのか、私にはまったくわかりません!あちこち検索しましたが、リリースモードでの最適化の無効化、バグ修正、およびスレッドセーフに関する文字列クラスに関するこの記事に関連するものしか見つかりませんでしたが、それが問題かどうかはわかりません。

私が使用している OpenCV のバージョンはパッケージではないことを付け加えておきます。特にTBB(ver 4.0 6005)でビルドしました。お気軽に質問してください。

4

2 に答える 2

0

この問題は、静的な初期化順序に起因します。

ファイル名は、他の statics に依存する static として宣言されているため (このプロジェクトには多くの static 変数があります)、初期化されていない変数をパラメーターとして取得しています。これが、不正な引数で例外を発生させた理由です。

変数の初期化と関数の実行時にブレークポイントを設定したおかげで、この現象を追跡できました。実行が最初に行われました... ただし、OutputDebugString関数に入る前に、パラメーターのトレースを作成することをお勧めします (リリース モードではトレースが機能しないため、表示を強制するもの)。

于 2013-12-11T18:51:42.427 に答える