VisualStudioの最近のブログ記事
Visual StudioだとWindowsなので,DirectX+HLSLが一般的だが,
WebGLとかをやろうとするとGLSLも必要になるので,両方に対応したハイライトプラグインが無いか調べたところNShaderというものがあるらしい.
しかし,オリジナルバージョンの NShader は VS2008 と VS2010 にしか対応していないので, VS2013 の場合は Fork して有志が作ったものを使う必要がある.
さらに直接,フォークしたものをダウンロードしてもソースコードしか無いので自分でビルドする必要がある.
自分でビルドしてもいいが,面倒な場合は,以下のサイトのビルド済みのものを使うと良い.
http://www.horsedrawngames.com/shader-syntax-highlighting-in-visual-studio-2013/
基本的には下のサイトが詳しく書いてあったのでそれに沿ってコンパイルした.
GSLをVisualC++でビルドする
環境はVC++10(2010)で,上のサイトより新しいgsl-1.15をコンパイルした.
基本的にはほぼ同じ変更で良かったが,何点か調整した.
「clはシンボリックリンクが読めない?」のところでコピーしているが今後,cygwinでシンボリックリンクが使えないと困りそうだったので,もう少し根本的な解決として以下のサイトを参考にlnコマンドを変更した.
Cygwinのlnをmklinkに変換するスクリプト
また,バージョンが違うためconfigureファイルは9139行目付近の
old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
を下のように修正した.
old_archive_cmds='ar cru $oldlib$oldobjs$old_deplibs'
これを行なっても下のエラーが解決されなかった
libtool: link: object name conflicts in archive: .libs/libgsl.lax/libgslblock.lib//cygdrive/e/dev/gsl-1.13/block/.libs/libgslblock.lib
libtoolを--debugオプションをつけて実行したところ競合のチェックは「sort -uc」コマンドでチェックしている事がわかった.
そこで「which sort」とやってみたらwindowsの方にもsortコマンドがあってそちらを呼んでいた.
最終的にパスを
/usr/local/bin:/usr/bin:<windowsのパス>
となるように設定したところうまくいった.
(/usr/local/binにはlnやccclを置き,/usr/binのsortを呼び出すようにした.)
OpenCVはバージョンがどんどん上がっていき、
バージョンごとにOpenCVのフォルダ構造まで違ったりします。
なので、まず自分の行った環境を以下に示します。
- Visual Studio 2010(C/C++)
- OpenCV-2.3.0-win-superpack.exe(http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.3/)
OpenCVは新しいものは2.4まで出ていますが、OpenCV-2.3.0ではsuperpackというライブラリ等がコンパイルがされた状態で配布されているので非常に簡単に開発をはじめる事ができるのでおすすめです。
さらに、ネット上のサンプルのコードはバージョンが古いものしかない場合も多いので、今回はopencv.jpにある物体認識のサンプルプログラム(http://opencv.jp/sample/object_detection.html)を動かすことを目的とする
まず、VisualStudio2010で空のプロジェクトを新規作成します。ここではcvTestというプロジェクト名にしました。
ソリューションエクスプローラーのcvTest右クリックして、プロパティを開きます。
「構成プロパティ→C/C++→全般→追加のライブラリディレクトリ」
に
「C:\OpenCV\build\include;C:\OpenCV\build\include\opencv」
と入力します。
次に、
「構成プロパティ→リンカー→全般→追加のインクルードディレクトリ」
の欄に
「C:\OpenCV\build\x86\vc10\staticlib」
を指定し,
「構成プロパティ→リンカー→入力→追加の依存ファイル」
に各種ライブラリを指定します.
私は以下のようにしました
comctl32.lib;Advapi32.lib;user32.lib;Gdi32.lib;libjasperd.lib;opencv_gpu230d.lib;libjpegd.lib;opencv_haartraining_engined.lib;libpngd.lib;opencv_highgui230d.lib;libtiffd.lib;opencv_imgproc230d.lib;opencv_calib3d230d.lib;opencv_legacy230d.lib;opencv_contrib230d.lib;opencv_ml230d.lib;opencv_core230d.lib;opencv_objdetect230d.lib;opencv_features2d230d.lib;opencv_video230d.lib;opencv_flann230d.lib;zlibd.lib
次に、ソリューションエクスプローラーのcvTest右クリックしてメニューから「追加→新しい項目」を選択します。新しい項目の追加でC++ファイルを選択し、名前をmain.cppにします。
このできたmain.cppに物体認識(顔認識)のサンプルプログラム(http://opencv.jp/sample/object_detection.html)をコピペする。
また,このプログラムは
「haarcascade_frontalface_default.xml」
を必要とするので,
「C:\OpenCV\opencv\data\haarcascades」
の中から
「haarcascade_frontalface_default.xml」
を探して,プロジェクトのソースコードがあるフォルダと同じフォルダにコピーしてください.
さらに,顔認識する対象の画像が必要になるので,適当な写真を用意して同じフォルダにおいておいてください.
これでプログラムをVisual Studioからデバッグ実行をするのですが,その前にコマンド引数として対象の画像ファイル名を渡す必要があるので,
もう一度,プロジェクトのプロパティを開き「デバッグ→実行時引数」に対象の画像ファイル名を書きます.
これでVisual Studioからデバッグ実行をすると対象の画像に対して顔の部分に丸のついた画像が表示されるはずです.
以前から気にはなっていたけど使わなっかったDoxygenを使う気になったので メモメモ
まず、自分はコメントとして///(スラッシュ3つ)使うのが好きなのでこれを採用
この場合、一行のみのコメントだとbriefになって、複数行続くと勝手にdetailになるようです。便利!
doxygenのはまりどころとしては、
VisualC++(2010以前で確認)ではソースファイルはデフォルトでShift-JISになります。
ソースコードのエンコーディングをDoxygenに教えるにはINPUT_ENCODINGのオプションを使います。
また、Doxygenが出力するファイルのエンコーディングはDOXYFILE_ENCODINGオプションを使います。
しかし、DoxygenのINPUT_ENCODINGをShift-JISに、DOXYFILE_ENCODINGをUTF-8にして、Doxygenのコマンドに使うと円マークとバックスラッシュの変換が都合よく行かず、
結果として、Doxygenコマンドを認識できないという問題があります。
(参考:http://blogs.yahoo.co.jp/onion_developer/5791986.html)
JavaDocスタイルのコマンドでは@マークを使うため、このような問題は起こりません。
しかし、texを入れてtexコマンドを使おうとしたときに同様の問題にぶつかります。
(自分はこちらに引っかかった)
そこで、回避策としてはINPUT_ENCODINGはCP932 を指定しましょう。
こうすると、Doxygenの中で円マークをうまくバックスラッシュとして読んでくれて、コマンドが通るようになります。