USBメモリで持ち運べるOpenCV開発環境

OpenCV2.4およびOpenCV2.2の開発環境を、USBで持ち運べるように構築しました。

github上でのこちら2.2版および、2.4.6版で公開しています。
ダウンロードして使ってください。

以下、解説は2.4.6版に準拠していますので、2.2版を使う場合は、適宜読み替えてください。

注意:
2013/11現在、2.4.6版は、最新のMinGW環境でコンパイルしたプログラムの実行に失敗します。
2.2版を使用してください。
また、2.4.6版を使用したい方は、古いMinGWを使用してください。
(2012/05付近のMinGWによるコンパイル成功を確認しています。)
また、ユーザ環境でコンパイルしたOpenCVライブラリならば上手く行くかもしれません。(参考URL)



カメラ映像の表示プログラムをコンパイルして実行した様子


通常の(VisualStudioを使った)OpenCV開発環境に対して、以下の特徴を持ちます。
・すでにOpenCVを導入しているPCでも、導入済みのOpenCVとお互いに影響がありません。
当然、古いバージョンでOpenCVが導入済みであっても、最新のOpenCV2.4が利用できます。
・USBメモリに入れて、開発環境ごと動作環境を簡単にコピーおよび持ち運びすることができます。
・Linux環境でもそのまま動きます。



イントロダクション

当時、所属していた大学の研究室でOpenCVを取り扱っていたので触ってみたことがあります。
その過程で、Webに多くの情報があるにも関わらず、どの方法に従っても上手く行かず、驚いた経験があります。
(このあたり、ARToolKitもそうでした。)
仕方がないので、Webの情報を参考にして繋ぎあわせ、独自に開発環境構築の手順を確立しました。

また、他にもこれを作った理由として、
・初心者がやりがちな「Webで調べて見つかるいくつもの方法で、いろいろなバージョンのOpenCVを導入しまくった結果、混在して環境が把握できない」というエセDLL HELL状態に巻き込まれるのを避けたい。
・OpenCV自体はマルチプラットフォームでLinux対応しているので、WindowsおよびLinux環境で、共通のソースとコンパイル手順が使えるようにしておきたい。
・ソース中のロードライブラリィ・マクロが汚いから嫌い(しかもこういったソースに限ってパス指定がフルパスで移植性が低い)。
などがあります。


OpenCV環境構築がむずかしい主な理由は、
・OpenCVのバージョンごとに使い方が大きく違う
    (バージョン 2.2, 2.3, 2.4 それそれディレクトリ構造が異なるなど)
・Visual Studioのバージョンごとに微妙に設定方法が違う
・作業者が「ライブラリ」に対する基礎的な知識を持っていない
あたりが大きいと思います。
単にライブラリの知識がないことだけが問題かもしれません。
こういったあたり、Visual Studioは初心者向けですが初心者の危険な泥沼でもある気がします。


今回はWindowsでの開発環境構築を紹介していますが、OpenCVを簡単に使いたいならばLinuxを導入することをオススメします。
環境構築がコマンド一発で済むからです。



「ライブラリ」「パス」「環境変数」について簡単に理解しておくとミスが減ると思います。

なお、本記事は以前に書いた記事Windows版Gtk+による、ウィンドウアプリケーション開発環境の作り方 の姉妹編です。
コピペして書き換えれば良いから楽に書けるなと考えていたら、OpenCV特有の問題を解決するために手順があちこち変わり、結局あまり楽ができませんでした。



プロジェクトディレクトリの使い方

githubからダウンロードしたプロジェクトディレクトリの使い方です。
プロジェクトディレクトリ本体の他に、OpenCV2.4のライブラリと、MinGW(Windows版gcc)コンパイラを入手して、プロジェクトディレクトリの中に配置する必要があります。

プロジェクトディレクトリは、右下にある
「Download ZIP」からダウンロードできる




 まずはプロジェクトディレクトリをダウンロードして解凍します。


OpenCV2.4ライブラリの導入

まずOpenCV2.4ライブラリから。
日本語Wiki2013年08月時点で、なぜかバージョン2.2のままです。本家ではすでにバージョン2.4を配布しているのですが。というか、2.2表記で配布しているのも2.2ですが、SourceForgeページ上部に最新版として2.4のリンクが表示されます。


.zipと.exeがありますが、とりあえず、OpenCV-2.4.6.0.exeをダウンロードします。


今回は他のOpenCV環境に影響を与えない目的があるため、以下の手順にします。(VisualStudioおよびその他の環境に影響を与えない)
インストール先フォルダも確認しておきましょう。インストール先に別のOpenCVが置いてあると、泥沼化の原因になります。


OpenCVライブラリを解凍する

前段階でダウンロードしたexeファイルから、opencvというディレクトリが作成されていると思うので、これをプロジェクトディレクトリの中へ、切り取り→貼り付けして、放り込みます。
これだけでOpenCVライブラリの配置は終了です。



MinGWコンパイラの導入

今回はコンパイラにMinGW(gcc)を使用します。MinGWは、コマンドプロンプトから使うコンパイラです。
公式ページで「Download」という単語をたどっていけば、そのうちSourceforgeのダウンロードページへ出ます。ページの上のほうあたりに、最新版インストーラへのリンクがあります。
ちなみにこの記事を書いた時の最新版は「 Looking for the latest version? Download mingw-get-inst-20120426.exe (662.7 kB)」でした。
インストーラを起動すれば、あとのインストールは簡単です。ただし、インストール中はインターネットに接続している必要があります。


普通のMinGWセットアップ手順では、このあとMinGWをシステムの環境変数に設定するのですが、今回は「開発環境を持ち運ぶ」というコンセプトに従って、後の!cons.batファイルで対応する手順を行います。

デフォルトでは、Cドライブの直下(C:¥MinGW)にMinGWがインストールされます。
このMinGWフォルダを中身ごとすべて、プロジェクトフォルダへコピーペーストして配置します。


この時点で、プロジェクトディレクトリのディレクトリ階層が
 OpenCV2.4-Standalone-Dev-Env-master
                opencv
                MinGW
                !cons.bat
                その他...
 となっているはずです。

コンパイルの実行

!cons.batをダブルクリックすると、コマンドプロンプトが立ち上がります。
このコマンドプロンプト上で、
make run
と入力してエンターすれば、付属しているhellocv.cコンパイルされ、実行されます。

PCに接続されたカメラを認識して、ウィンドウにカメラ画像が映れば成功です。
(ESCキー押下で終了)
カメラを検出できなかった警告が出たり、カメラ選択画面が出ても、コンパイルには成功しています。適当なUSBカメラを繋げば映るようになります。



このあとは?

OpenCVで作りたいものを作れば良いと思います。
サンプルのソースファイルhellocv.cの内容を書き換えて再コンパイル(make run)するだけです。

OpenCVの基本的なライブラリの使い方はOpenCV.jpのサンプルページが参考になります。

ソースコードの記述にメモ帳を使うのは大変つらいので、何か良いテキストエディタをプロジェクトディレクトリに入れて、一緒に持ち運ぶと良いです。
持ち運び用のテキストエディタとして、個人的にはTeraPadをオススメします。もちろん常用可能で、わたしはいつもTeraPadを使っています。
もちろん、開発PCにVisualStudioが入っているなら、テキストエディタとして利用する手もありです。

バージョン管理にはGitを使用しています。このあたり好みでhg(Mercurial)でも良いです。

Linux環境で動かしてみたい場合、本記事の最後あたりに手順を書いておきました。






備考:プロジェクトディレクトリを一から組み立てる


後から導入するOpenCVライブラリとMinGWコンパイラを除けば、基本的にすべてテキストファイルです。
何ら特別なファイルはないので、すべて自前で準備することができます。
詳しい仕組みを知っておきたい場合や、問題発生時にスムーズに対処したい場合には、この手順を知っておべきですし、自分でやってみることをおすすめします。



プロジェクトディレクトリの作成

空のディレクトリを作成して、ファイルを配置するだけです。

まず、空のディレクトリですが、C:ドライブの直下に作るのがオススメです。とはいえ、ホームディレクトリやデスクトップに作っても基本的には問題ありません。(というかそうなるように設定していきます。)
ディレクトリの名前も適当に付けます。hellocvなどでいいです。

コンパイルテスト用に、OpenCVアプリケーションのソースファイル「hellocv.c」
開発用コマンドプロンプトを呼び出すためのバッチファイル「!cons.bat」
コンパイル時のライブラリ指定などをあらかじめ記述しておくための「makefile」
を作成して配置します。


OpenCVのサンプルアプリケーション「hellocv.c」を用意する


コンパイルをテストするためのコードを用意します。
基本的には、OpenCV.jpのサンプルページが良いです。
コピーアンドペーストして、hellocv.cファイルを作成してください。

標準的なOpenCVプログラムの書き方を守っているコードを使いましょう。
個人ブログなどに記載されているコードは、保守されていなかったり、環境依存(汚いライブラリマクロなど!)であったりするため、避けたほうが無難です。
その他の選択基準としては、
#include <cv.h>
#include <highgui.h>

が入っているC言語のソースプログラムで、別途画像ファイルを必要としないこと、カメラのテストを兼ねてカメラ画像を使用すること、があります。

.txtの拡張子が変更できない問題を回避して、ファイル名をhellocv.cに変えてください。
ファイルのリネーム方法は、以下で説明する !cons.bat の手順をどうぞ。


開発環境バッチファイル「!cons.bat」

コンパイルはコマンドプロンプトで行います。
また、OpenCVアプリケーションをコンパイルするためには、環境変数を設定する必要があります。
MinGWのときのように、環境編集Pathを設定する方法もあるのですが、「他のOpenCV環境に干渉しない」目的のため別の方法をとります。
その方法とは、バッチファイルを作成し、環境変数を設定済みのコマンドプロンプトを呼び出すこととです。

コマンドプロンプトを呼び出すバッチファイルを書く

メモ帳を開いて、以下の一行を記入します。
cmd.exe
以上です。 !cons.txtという名前で保存しておいてください。
(なお、この名前に理由はありません。何でもいいです。)

テキストファイルをバッチファイルに変える

といっても、ファイルの拡張子を変えるだけの簡単なお仕事なのですが。
ですが、実はここが一番の難所です。
というのも、Windows環境は、デフォルトで拡張子を変えられないからです。

というわけで、Windowsの設定を変えます。
適当なフォルダを開いて、Altキーを押すと、タスクバーが出ますので、その中の「ツール(T)」 から「フォルダーオプション(O)」を呼び出します。
「表示」タブの詳細設定から、「登録されている拡張子は表示しない」のチェックボックスを外して無効にします。
 上の「フォルダーに適用(L)」ボタンを押して、全フォルダに適応します。

この状態で、先ほど作った !cons.txt ファイルを見ると、たぶん、「!cons.txt」か 「!cons.txt.txt」あたりのファイル名になっており、拡張子.txtがしっかり表示されているはずです。

ファイルを右クリックして出てくる「名前の変更(M)」から拡張子を変更します。
バッチファイルにするには、ファイル名の末尾が".bat"になっている必要があります。
ファイル名を、
!cons.bat
に変えてください。

では !cons.bat ファイルをダブルクリックして実行してください。
コマンドプロンプトが立ち上がれば、ここまでは上手く行っています。


OpenCVアプリをコンパイルできる環境変数を設定する

PATHを指定する必要があります。
SETコマンドを使えば、システムの環境変数を上書きする形で、そのコマンドプロンプトだけで有効な環境変数を設定することができます。
例:
set PATH=opencv\bin;%PATH%

コマンドライン上でそのまま入力して使えます。つまり、バッチファイルに書いて使えるということです。
なお、バッチファイルを編集するには、右クリックから「編集」を選択します。


!cons.bat


:: GCCがヘッダファイルを探索するための環境変数設定
:: &ヘッダファイルのインクルードパス
set C_INCLUDE_PATH=opencv\build\include\opencv;%C_INCLUDE_PATH%
:: opencv2へのパス追加
set C_INCLUDE_PATH=opencv\build\include;%C_INCLUDE_PATH%
:: C++対応(未確認)
set CPULS_INCLUDE_PATH=%C_INCLUDE_PATH%;%CPULS_INCLUDE_PATH%
::GCCが静的ライブラリを探索するための環境変数&パス指定
set LIBRARY_PATH=opencv\build\x86\mingw\lib;%LIBRARY_PATH%
::GCCが動的ライブラリを探索するための環境変数&パス指定
set PATH=opencv\build\x86\mingw\bin;%PATH%
:: "エイリアスの追加(make runできるようになる。)"
doskey make = mingw32-make $*
doskey rm = del $*
cmd.exe


なぜエイリアスの追加をするかというと、MinGWに付属しているmakeは、ファイル名がmingw32-make.exeであり、そのままではmakeと打って使うことができないからです。
doskeyコマンドはコマンドプロンプト上で打った内容を実行前に置き換えてくれるので、makeと打てばmingw32-make.exeが起動するようになります。
(これで、WindowsとLinuxの環境の違いを吸収しています。)

今はまだコンパイル作業ができないので、make(mingw32-make)が無事に呼び出せることだけ確認しておきましょう。
コマンドプロンプト上で、
make
と打って実行し、makeによる英語のエラーが出れば、makeの呼び出し成功です。
「操作可能なプログラムまたはバッチ ファイルとして認識されていません。」などと表示される場合、パスの指定かエイリアスの設定に失敗しています。



「makefile」の記述と使用

gtkと違って、OpenCVはコマンド手打ちによるコンパイルが現実的ではありません。
ライブラリに、pkg-configが 添付されていないからです。
そこで、makefileを作ってコマンド入力の負担を軽減します。
また、いずれにせよ、本格的な開発でソースの規模が大きくなればmakeを使うことになるかと思います。

makefileにはコマンド置換機能があるので、オプション指定などもコマンドラインより簡単に書けます。

makefileのファイル名は makefile であり、必ず拡張子が付いていないことを確認してください。
また、今回は利便性のため、同じ役割をもつmakefile.txtを作成します (といっても、今回の場合makefile.txtの方が本体ですが)。


makefileおよびmakefile.txtの内容は、下記の通りです。
ただし、makefileは行頭のタブが意味を持つ構文です。行の先頭の空文字はタブでなければならないので注意してください。

makefile
#makefileは、makefile.txtの内容を読み込むだけ
include makefile.txt

makefile.txt

#ソースファイル名
MAIN =hellocv.c
#実行ファイル名
prj =cv
#OpenCVライブラリオプション
ifeq ($(OS),Windows_NT)
# Windows 上で実行された
#バージョン2.4決め打ち
VER=240
#windows環境にpkg-configは標準で存在しないので、リンク指定を決め打ちする
CV_ARGS = -lopencv_core$(VER) -lopencv_imgproc$(VER) -lopencv_highgui$(VER) \
-lopencv_ml$(VER) -lopencv_video$(VER) -lopencv_features2d$(VER) \
-lopencv_calib3d$(VER) -lopencv_objdetect$(VER) -lopencv_contrib$(VER) \
-lopencv_legacy$(VER) -lopencv_flann$(VER)
CONS_BAT=!cons.bat
else
#Linux環境向け自動設定(下のwindows版設定をコメントアウトすると有効化)
#なお、pkg-configを使うと、OpenCVのバージョンは自動設定されるので、制限されない。
CV_ARGS =$(shell pkg-config --cflags --libs opencv)
endif
$(prj).exe: makefile makefile.txt $(MAIN) $(CONS_BAT)
gcc $(MAIN) -o $(prj).exe $(CV_ARGS)
run: $(prj).exe
./$(prj).exe
clean:
rm $(prj).exe


 

makefileの記述は以上です。



OpenCVライブラリとMinGWコンパイラの導入

ここまでの手順で、配布している環境と同じものができています。
よって、OpenCVライブラリとMinGWコンパイラの導入手順は、この記事の上の方で「ダウンロードしたプロジェクトディレクトリの使い方」とまったく同じです。

コンパイルの実行


コンパイルと実行は、以下の一行を打つだけで終わります。
make run
これまでの手順に問題がなければ、opencvアプリケーションが起動します。



その他雑記

!cons.batの記述は、OpenCVのバージョンによって変える必要があります。
主に、ディレクトリ構成が違うことと、コンパイルオプションの指定にバージョン番号が含まれていることが理由です。

OpenCV2.2のインストーラを実行すると、ディレクトリ階層は、
OpenCV2.2
       bin           (dllが入っている)
       include   (ヘッダファイルが入っている)
       lib            (libが入っている)
      ...(その他)
という構成になっています。

OpenCV2.4のexeを実行すると、ディレクトリ階層は、
opencv
        ...
        build
                ...

                x64
                x86
                         vc9
                         vc10
                         mingw  (MinGW用バイナリ)
                             bin    (.lib ファイル)
                             lib      (.dll.a ファイル)
という構成になっています。

また、OpenCV2.4では、コンパイラごとにバイナリが用意されています。


opencv2.2はpkg-configに対応しています(.pcファイルを持っている)。
今回作成した、makefileに記述されているライブラリ指定オプションは、gtkライブラリに付属していたpkg-configで引数を出力させて、それを(多少汎用的に)整形したものです。




opencv開発環境としてLinuxをオススメする理由。

開発環境の構築が、コマンド一発で済むからです。
sudo apt-get install libopencv-dev
また、Linuxではpkg-configなどでコンパイルオプションが自動設定されるため、OpenCVのバージョンの違いを気にしなくて済みます。

OpenCVが今後活躍する領域として、Linuxサーバ上のWebアプリケーションのマスは大きいと思います。


本記事のプロジェクトディレクトリをLinux環境で使う方法

Linux環境でプロジェクトディレクトリを使う場合、
・適当なターミナルを起動
・プロジェクトディレクトリへcdで移動した
・Windowsと同じコマンドの make run を実行します。
という手順で、コンパイルおよび実行することができます。
(!cons.batで行った環境設定は、Linuxではパッケージ導入時に自動で行われます。
そもそも!cons.batはLinuxでは起動しません。)


なお、本記事のmakefileは、Windowsとその他の環境を検出してオプションを変えることで、WindowsとLinuxの両方で使えるように工夫してあります。
(詳細はmakefileのコメント行に記載。)

このブログの人気の投稿

GIMP2.8でイラストにペン入れを行う

squid3プロキシサーバの設定(Ubuntu13.10)

ubuntu13.04で無線LANが繋がらない場合の対処