OpenCVのflip関数の第3引数

cv::flip(src_img, dst_img, 0); // 水平軸で反転
cv::flip(src_img, dst_img, 1); // 垂直軸で反転
cv::flip(src_img, dst_img, -1); // 両方の軸で反転

Visual StudioでOpenCVを使う

なんで内燃機関のエンジニアがVisual Studioを使わないといけないんだというぼやきは置いといて,これも宮仕えのならいなのだ.

ビルド->構成マネージャーで新規を選んでx64にする.

プロジェクト->プロパティで構成をすべての構成に変える.

C/C++下の全般を選び,追加のインクルードディレクトリにC:\opencv\build\includeを指定

リンカー下の全般を選び,追加のライブラリディレクトリにC:\opencv\build\x64\vc12\libを指定

あとはビルドすれば良し.

これでは足りなかった.pathの設定やopencv_lib.hppのダウンロードなどが必要になる.それらについてはこのサイトが詳しい.

OpenCV1.0と2.4でresizeの挙動が違う

今日はプログラムのデバッグで1日潰れた.複数人で画像処理をしているのだが,一人を除いてうまく行かない.そんなに複雑なことをしてないのにだ.いろいろ調べているうちにうまく行っている一人だけがOpenCV1.0を使っていることが分かった.残りの人はOpenCV2.4.9だ.未だにOpenCV1.0を使っているということ自体に驚いたが,うまく動くかどうかはOpenCVのバージョンの差だということが分かった.そして,それぞれのバージョンの使っている関数の挙動をひとつひとつ比較するという地味な作業の末,原因が分かった.画像のサイズを変える関数resize(OpenCV1.0ではcvResize)が違うのだ.OpenCV2.4.9でresizeして画像を縮小すると高周波成分がよく残り,尖鋭な画像になる.対してOpenCV1.0だと高周波成分が消えてぼけたような画像になる.両方とも補間の指定はINTER_AREAだ.我々の行っていた画像処理では高周波成分が消えてくれた方が好ましかったので,OpenCV1.0の場合だけうまく動いていたのだった.それにしても,resizeなんて良く使う関数の挙動がバージョン違いでここまで違うとは驚いた.我々以外にもこれまで困った人がいたのではないかな.

OpenCVでアサーションエラー

先週まで正常にビルドできて動いていたOpenCVのアプリが突然動かなくなった.こんな感じのエラーがでる.

OpenCV Error: Assertion failed (i >= 0) in hoge, file fuga.cpp, line 8

正常に動いていたときに比べて,ソースコードは1行たりとも変えていない.なぜエラーが出るのか.Windows OSのせいじゃないのか.

途方に暮れて,プログラムを全部作り直すことにした.新しいプロジェクトを作って,新しい.cppファイルを作って,動いていたときと同じcppのコードを記述した.そしてビルドすると,果たして今度は正常にビルドできて動いた.???

何が起こっていたのだろう?メモリーのビットエラー?宇宙線の影響?HDDの読み出しエラー?全く分からない.コンピューターって結構いい加減だということが分かった.

OpenCVの64bitアプリを作る

2時間くらいはまってしまった.

  1. ビルドの構成マネージャーでプラットフォームにx64を選択
  2. プロジェクトのプロパティでリンカーの追加ライブラリのディレクトリにx64\libを指定

これだけで動くと思って動かしたら,エラーで動かない.どうもx86のライブラリを読んでいるようなのだ.さんざん悩んでネットをさまよったら,答が見つかった.システムプロパティのパスにC:\opencv\build\x86\vc12\binを指定していたのが原因だった.ここをC:\opencv\build\x64\vc12\binに変えたら64bitアプリが動いた.

OpenCVのプロジェクト設定をサボる

OpenCVではプロジェクトを作成するたびにインクルードファイルやら,ライブラリファイルの在り処を指定するのが面倒だった.ところが,ネットをさまよっていると,それらを省略できる方法を見つけた.ありがたや.

C:Usersユーザ名AppDataLocalMicrosoftMSBuildv4.0Microsoft.Cpp.Win32.user.props

のファイルに,以下の内容を加える.

<PropertyGroup>
<IncludePath>$(IncludePath);D:OpenCV2.4.6opencvbuildinclude</IncludePath>
</PropertyGroup>
<PropertyGroup>
<LibraryPath>$(LibraryPath);D:OpenCV2.4.6opencvbuildx86vc10lib</LibraryPath>
</PropertyGroup>

これだと,ソースファイルを作ったらいきなりビルドできるようになる.なんと楽ちんな.