OpenCV any.h copy_from_valueでのエラーC2061

識別子destの使い方がおかしいと言われてなんじゃらほいなのだけど、これは癖のあるエラーなので記録する。

VisualStudioなどで、newをDEBUG_NEWに#defineしていたりすると、このエラーがでる。newはnewじゃないといけないわけだ。

 

#ifndef _DEBUG

#define new DEBUG_NEW

#endif

というブロックを探して、これより後でopencv関連のファイルを#includeしていないかチェックしよう。

#includeを先にしておけばOKだぜ。

 

3時間ロスったつらい。

VisualStudioでどうしてもインクルードパスが無視される

VisualStudioでどうしてもインクルードパスが無視される。

と2時間くらい悩んでいました。パスを設定しているはずなのに、そこを検索していないように見えるのです。

仕方ないのでローカルにコピーしてみたり、いろいろしてみましたが、旨い解決法が見つかりません。

うーんと悩んでいたら、いつの間にかx64のはずのところをWin32でビルドしようとしていました。それでは設定したオプションが無効になるわけです。

ありがちな事故なので、ここに報告します。

 

fprintfなどで作ったFITSがうまく読みだせなかった失敗の原因

天文用FITSファイルを読み出すことが時々あります。普通は、cfitsioなどのライブラリを用いて読み書きしますが、フォーマットが簡単ではあるので自力で書いてみたりしようとすることもあります。でも、ときどき失敗してしまいます。

fprintfなどで出力したFITSファイルが、世の中にあるfvやds9で読めなかったら、自分が悪い可能性が高いです。いや、FITSフォーマットの仕様がよくないとも思うのですけどね。

私のやった失敗をログします。

ある時、私はFITSを出力していました。ところが、これをds9で読み込むと、読み込み時に落ちてしまいました。

仕方ないのでfvを使ってみたら、108エラーで終わりました。ENDが読めないなんてメッセージを残していましたが、頓珍漢なものでした。ENDはちゃんと書いてあります。

途方にくれました。

結論を申します。FITSはヘッダが80文字です。値を変更したところ、文字数が不足になっていました。fprintf()などで出力するときは、とくに文字数に注意しましょう。

変数を書式付き出力した際に文字数に無頓着になっているとダメです。ちゃんと、揃えましょう。

これ、注意しましょう。

 

久しぶりにOpenCVを動かしたときの設定手順

なんかPCにインストールされているような気配のあるOpenCVを久しぶりに使ってみることにした。

 

とりあえず簡単なサンプルコードを用意して、空のプロジェクトでビルドしてみた。

※MFCなプロジェクトでテストするときは、GUIのソースディレクトリで以下のmainをtest()に変えたものを配置してプロジェクトの設定をテストするとよい。

 

もちろん、エラーが出た

1>c:\users\watashi\documents\visual studio 2015\projects\cvtest\cvtest\cvtest.cpp(6): fatal error C1083: include ファイルを開けません。’opencv2/core.hpp’:No such file or directory

 

該当ファイルがどこにあるか探してみると、以下に見つかった。

C:\opencv\build\include\opencv2

 

以下をインクルードパスに追加する。

メニューから[プロジェクト]→[プロパティ]
以下、[構成プロパティ][VC++ディレクトリ][インクルードディレクトリ]

追加 C:\opencv\build\include\

再ビルド、もちろんエラーがでる。ライブラリのディレクトリを設定していないから当然だ。

1>cvtest.obj : error LNK2019: 未解決の外部シンボル “void __cdecl cv::fastFree(void *)” (?fastFree@cv@@YAXPAX@Z) が関数 “public: __thiscall cv::Mat::~Mat(void)” (??1Mat@cv@@QAE@XZ) で参照されました。

(中略)

: fatal error LNK1120: 9 件の未解決の外部参照

ライブラリはここにあった。

C:\opencv\build\x64\vc14\lib

メニューから[プロジェクト]→[プロパティ]
以下、[構成プロパティ][VC++ディレクトリ][ライブラリディレクトリ]

 

これを先ほどと同じようにライブラリディレクトリに追加した。さらに、リンカの入力に、release: opencv_world330.lib  debug: opencv_world330d.libを追加した。

メニューから[プロジェクト]→[プロパティ]
以下、[リンカー][入力][追加の依存ファイル]

ここに追加する。releaseとdebugでファイル名を変えると、デバッグ情報が使える。

releaseとdebugのプロジェクトは両方同時にプロジェクト設定をこなしておくべき、無精すると結局苦労することになる。

 

ビルドできた。と思いきや、

1>opencv_world330d.lib(opencv_world330d.dll) : fatal error LNK1112: モジュールのコンピューターの種類 ‘x64’ は対象コンピューターの種類 ‘X86’ と競合しています。

くそったれめ!一生懸命設定したのにプラットフォームがwin32になっていた。x64に変えてもう一度上記作業を行い、設定完了。

dllのパスを設定する必要があるかもしれない、面倒ならWindowsフォルダへコピペしちゃえ。