2014年12月13日土曜日

OpenCVでimreadが失敗するときは

概要と結論を先に書く。

Microsoft Visual Studio の 出力モードを Debug にしたうえで Release としてビルドされた OpenCV の cv::imread を使うと、内部で外側のライブラリか何かを読み込む処理が不味いらしく cv::imread から得られる Mat の data が NULL になる、つまり cv::imread が画像を読み込まない。解決法は出力モードを Release にするか OpenCV のビルドを Debug にするか、のどちらか。

//未試験ではあるがおよそOpenCVをDebugにしてVSをReleaseにしても似たような不具合が起こるかもしれない。

より子細にググりたい人向けに、私の用いた検索ワードは以下の通り

opencv imread debug

気付いた理由はただの勘。

参考になりそうなStackOverFlowの質問へのリンクを張っておく。

c++ - OpenCV imread(filename) fails in debug mode when using release libraries - Stack Overflow - http://stackoverflow.com/questions/9125817/opencv-imreadfilename-fails-in-debug-mode-when-using-release-libraries

--

ググってきた人向けに結論を先に書いておいた。以下は私の日記帳だ。

日記と混ざった技術系エントリを書いてくれる方がたまにいるが、結論にたどり着くまでに日記を読むのはつらいことが多い。誰があなたの食べたラーメンを知りたいのだろうか?技術の話を聞きに来たのに。

人のふり見てわがふり直すべきなので、ググってきた人には先に結論を。日記が読みたい人は日記を読めば良い。読む人がいない?日記帳というのはそういうものだ。

さて本題。久々にOpenCV。といっても最近はOpenCVでC++/C#なコードを息抜きに書くので、まあ10日ぶりくらいのOpenCV。

まあそんなわけでOpenCVでSURFでもやろうと思った。こいつは物体を認識してくれるすごいやつだ。詳しくはググったほうが私の説明より良いだろう。

今回、SURFを用いて、「探される画像」と「探したい画像」を使い、探される画像のどこらあたりに探したい画像が存在するかを検出したかった。

当然だがテストとしても、実際に動かすにしても、「探したい画像」くらいはどこかにあるファイルとして入力した方が良い。

そのために使えるのがOpenCVのimreadだ。こいつはパスを入れるだけで画像を読み込んでくれる。非常にシンプルだ。

で、まあ、結論に書いたとおりである。こいつが動作しなかった。

ReleaseとDebugのモードに原因があると気付いたのは完全に勘で、試しに動かしたらどうやら挙動が変わったので詳しくググってみたらそのようである、というStackOverFlowの記事等があった。'

ほかのメソッド類はきちんと動くので、実際わけがわからないが、まあとにかく内部のことなら仕方がないだろう。変えられない理由もあるはずだ(ないなら即座に変えてくれ。頼むから)。

そういうわけで、C++のdllがReleaseでコンパイルされていくことになった。OpenCVをDebugで再ビルドするのは手間なので、問題が起きるまではひとまずこれで進めていく。

最後に、せっかくの日記なので私が最近食べたラーメンについて記しておこう。

私は現在静岡県浜松市に住んでいるのだが、ここのつけ麺屋が最近のお気に入りだ。

麺喰いカケル (kakeru) - 遠州曳馬/ラーメン [食べログ] - http://tabelog.com/shizuoka/A2202/A220201/22026427/

私のオススメはさらっとした中華スープのほう。もちろん濃厚スープも美味しいが。

3 件のコメント:

  1. どんぴしゃでした。
    VisualStudio + OpenCV2.4.13 で imread したところ、ファイル名も画像も全く問題ないのに何故か読み込めない。よもやでググってみて、このサイトの通りに opencv_core2413d.lib のほうを使ってみたら、動くじゃん! OpenCV3では直っているみたいですが、、、いやー、こんなことで1時間も使っちゃったよ。助かりました。

    返信削除
  2. はいっ、ドンピシャでした。
    OpenCVとC++の超初心者。
    サンプル落として実行したら、imreadで読めなかったのでググっていたら、このサイトに出くわしました。
    Visual Studioのプロジェクトプロパティで、libを使い分けて解決しました。
    ありがとうございます。

    返信削除
  3. 愛してます
    助かりました

    返信削除