謎の目眩、動悸、頭痛

朝から慣れない画像処理のプログラミングに集中していた。オリジナル処理アルゴリズムなのでOpenCVは入出力にしか使えない。OpenCVのmat形式は画素アクセスが非効率的で困ってしまう。17時頃、頭がぼうっとしてきた。目眩がする。動悸が激しくなった。頭痛がする。起きていられなくなくて、ソファーに倒れ込んだ。まったく動けない。目眩はするが頭が働かない訳ではない。同僚に救急車を呼んでもらおうかと思ったが、病院から出てきたら、荷物を取りに会社に戻らなければならないのが結構面倒だ。命にかかわる状況ではなさそうだと勝手に判断してソファーに倒れ込んだまま1時間半安静にしていた。眠れはしなかった。1時間半後、立てるようになった。しかしフラフラだ。有効かどうかわからないが、会社にある栄養になりそうなもの、野菜ジュース、カロリーメイト、アーモンドを胃に詰め込んだ。30分くらいしたらなんとか歩けるようになった。そのまま退社した。一体何だったんだ。ネットで調べると、目眩と吐き気は自律神経失調症らしい。ストレスが原因だ。慣れないプログラミングがストレスになったのだろう。仕様を書いて専門のプログラマに仕事を任せたほうが良かったか。でも仕様を書く時間があったらプログラムが完成しそうなので、なかなかそういうふうにしようと思わないんだよ。

しかし,ほぼ健康体だと思っていたのに突然あんなことになったということは,身体に何か問題があるのかもしれない.病院に行って検査してもらった.血液を採って検査だ.結果が出るのは一週間後.

広告

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の例プログラムに以下のような記述があった

CvMat* dft_A, tmp

dft_AはCvMatを指すポインタだ.じゃあtmpは何だということになった.ポインタかそうでないのか.調べるとtmpはポインタでないことが分かった.この記述を分かりやすく書くと

CvMat *dft_A, tmp

となる.上の書き方では紛らわしいので,下の書き方の方が良いと思う.