※ 9/4 12:00 インストールパッケージ名が間違っていたので修正
上図は、任意の画像から顔を検出したところ
OpenCVはOSSの画像処理ライブラリーです。C++, C, Python, Java からの操作や、Windows, Linux, Mac OS, iOS, Androidをサポートしています。
日本で出ているOpenCVの書籍の多くはC++を実行させるためにWindowsとVisual Studioを使わせるパターンが多いですが、OpenCV自体は前述のようにWindows以外でも動かすことができます。今回は汎用的に使えるLinuxで動かすことにしました。
とりあえず今回はUbuntu上で動かす流れを書いてみたいと思います。 インストール方法は次のサイトを参考にしました。
ただし、この方法は必要なライブラリーをインストールしない場合がありますので、次のようにコマンドを実行してインストールしました。
$ sudo apt install libopencv-dev libcv2.4 libcvaux2.4 libcvaux-dev libhighgui-dev libhighgui2.4 libopencv-highgui-dev libopencv-highgui2.4-deb0 libopencv-imgproc2.4v5 libopencv-imgproc-dev
インストールするUbuntuのバージョンによって、インストールできる各コンポーネントのバージョンが異なると思います。apt search
コマンドで必要なパッケージの名前を確認しましょう。
$ apt search opencv $ apt search libcv $ apt search highgui
今回使ったのはUbuntu 17.04で、このバージョンでインストールできるOpenCVは2.4.9.1でした。もっと新しいOpenCVを使いたい場合はPPAを探しましょう。ただ、OpenCV 2と3ではソースコードの書き方が違うと思います。注意しましょう。
必要に応じて、他のlibopencv-*
のような名前のライブラリーを追加で入れます。ちなみにOpenCVとlibopencv-*
のライブラリーを全てインストールするとOSを含めて/は6GB消費していました。
OpenCV 2ではPython2でAPIを使ってAPIを叩けるようです。追加でこの辺りのパッケージを入れておくといいようです。
$ sudo apt install python-opencv python-numpy python-scipy python-matplotlib python-urllib3
インストールがおわったら、いろいろ動かして見ましょう。OpenCVのソースコードにサンプルのソースコードがいろいろ収録されているので、これをダウンロードします。
$ wget https://github.com/opencv/opencv/archive/2.4.13.3.zip $ unzip 2.4.13.3.zip
サンプルをいろいろ実行してみます。C++版のコードはLinuxではg++コマンドでビルドする必要があります。実行結果は-oで指定したファイル(ここでは便宜的にファイルの最後に.outをつけたファイル名にしています)を実行すると、実行結果が表示されます。Pythonのコードを実行したい場合はpython2のディレクトリー内のサンプルを実行してください。だいたい同じようなサンプルソースが揃っています。
$ cd opencv-2.4.13.3/sample/cpp $ g++ inpaint.cpp -o inpaint.out `pkg-config --libs --cflags opencv` $ ./inpaint.out
ここまでできたら、次に以下のサイトを参考にいろいろやって見ましょう。このサイトではC++版のソースコードがサンプルとして掲載されています。
OpenCV.jp : OpenCV逆引きリファレンス — OpenCV-CookBook
Pythonから使う場合は次のサイトの例が参考になりそうです。
OpenCV-Python チュートリアル文書のページへようこそ! — OpenCV-Python Tutorials 1 documentation
Ubuntuのデスクトップ環境
UbuntuのMinimalCDをダウンロードして、Ubuntu 17.04をインストールしました。インストールの最後に追加でインストールするパッケージの選択が出るので、Ubuntu Mate minimal
を追加で選択しました。
ソースの編集環境
ソースの編集にはgeditを使いました。選択した理由はなんとなくです。
ビルド方法
C++のソースコードは、次のようなコマンドラインを端末で実行します。
g++ hoge.cpp -o hoge.out `pkg-config --libs --cflags opencv` ./hoge.out
画像から顔を検出する
顔を検出するのコードを実行しても何も起こらないので、なぜかなと思ったら評価器を用意する必要があったんですね。ソースコードにもxmlファイルを定義しているところがあって気がつきました。ソースパッケージのdataディレクトリーやGithubにいくつか用意されていますので、ソースコードの以下の部分のパスを正しく設定すればちゃんと動きました。
... // 分類器の読み込み std::string cascadeName = "./haarcascade_frontalface_alt.xml"; // Haar-like //std::string cascadeName = "./lbpcascade_frontalface.xml"; // LBP
最後にOpenCVについてまとまっていたスライドがあったので、以下に埋め込んでおきます。
www.slideshare.net