C++コードがいくつかあり、関数imread(file)
を除いて、すべてがOpenCVで正常に機能していました。ファイルを正しく見つけて名前をロードしていましたが、データをロードしていませんでした。
Mat pattImage = imread(fileName, 0);
Webで再検索した後、デバッグモードになっているのに、デバッグライブラリではなく、リリースOpenCVライブラリがあることに気付きました。
debug library: opencv_core231d.lib
release library: opencv_core231.lib
これは何もすべきではないと思った典型的な愚かなエラーですが、デバッグライブラリはOpenCVコードのデバッグを許可するはずですが、リリースライブラリはコードのより高速な実行を許可しますが、私はしませんt imreadが失敗した理由を理解します。
debugとreleaseライブラリの違いを誰かに教えてもらえますか- OpenCVそしてなぜこのエラーが発生するのですか?
OpenCVバグですか?
Windows用のC++ OpenCVインターフェースには最も大きなバグがあるだと人々に言うのに飽きることはありません。
Cインターフェースを使用して小さなテストを記述し、機能するかどうかを確認します(cvLoadImage()
など)。
pdate:Cインターフェースが適切に機能していることがわかったので、メーリングリストにアクセスしてこのバグを報告するか、自分でコードを調べて、失敗した理由を見つけてください。
リリースモードでは、デバッグライブラリ-デバッグライブラリでリリースライブラリを使用する必要があります。バグではありません。
Qt(Qt Creator)を使用してこの問題があり、それぞれのライブラリのデバッグバージョンをリンクすることで修正されました。これは、プロジェクト構成ファイル(.pro)で自動的に実行できます。
一般に、「デバッグ」実行可能構成を「リリース」構成ライブラリにリンクすることは完全に合法です(ライブラリによってエクスポートされるシンボルがデバッグとリリースで同じである必要があるのはなぜですか)。 (何らかの理由で)「混合」が発生したくない場合を除きます。 opencv開発者がそのような混合を許可しないことに決め、コードの特定の部分(リリース3.4.4行54のファイルcvdef.hで見つけることができるもの)でそのような禁止を実行していることがわかりました。これはC++インターフェイスのバグではなく、「望まれる」動作です。この変更が文書化されている https://github.com/opencv/opencv/pull/9161 で詳細を確認できます。
円記号()ではなく、FORWARDスラッシュ(/)を使用します。 Windowsでも!
不正解:
cv::imread("C:\example\1.jpg");
正しい:
cv::imread("C:/example/1.jpg");
この問題を回避するには、デバッグアプリケーションのランタイムライブラリを/ MDd(マルチスレッドDLL debug)から/ MD(通常のリリースバージョン)に変更します。マルチスレッドDLLランタイム)。
コードは依然として最適化されておらず、通常のリリースモードよりもデバッグが容易ですが、一部のデバッグ情報が失われます(たとえば、Cランタイム内でのクラッシュの場合)。また、デバッグヒープなどの一部のデバッグ機能が失われますが、それが何であるかわからない場合は、影響はありません。
これを回避するには、[プロパティ]> [C/C++ /コード生成]に移動し、[ランタイムライブラリ]を/ MDdから/ MDに変更します。