【ちょっと技術的なことAdventCalender】OpenCV3の環境構築について整理してみた
この記事はちょっと技術的なことAdventCalenderの5日目です
こんばんは。
しばらく書いてなかったのでAdventCalendarをきっかけに久々に更新を頑張ろうと思ってます。はい
でも一人で24日連続はさすがに無理なのでQiita側で記事を書いている友人と共同で頑張って埋めようと思ってます。
友人はあらゆる言語について少しずつ触っていくことをやるみたいです。僕は今まで書こうと思ったけどここに書いてなかったことをジャンル関係なしにブッ込もうと思います。
というわけで、ちょっと技術的なことAdventCalender見てやってください。
そんなこんなで今日の内容にいってみたいと思います。
OpenCVの環境構築で毎度死ぬ話
画像処理エンジンとしてこの上なく有名なOpenCVだが、新しいPCを買ったなどの理由で環境構築をしようとすると毎度躓く。
こいつめ…特にC++の場合はソースコンパイルして突っ込むしかないから本当に厄介だ。
そんなわけで、今回は自分へのメモを兼ねて(いつもそうなのだが)、OpenCV3の環境構築をおさらいしようと思う。
ちなみに今回の環境はUbuntu14.04 LTS (64bit)である。
環境構築 (Python編)
Pythonはフィーリングプログラミング言語と研究室内で勝手に呼んでいるだけあって、結構あらゆることが簡単にできるようになっている。
C++ではクソみたいに苦労したOpenCV3のインストールも、Pythonの仮想環境(Conda)上で動かせるようにするだけならだいぶ簡単だ。
anacondaのインストールと仮想環境のセットアップ
https://www.continuum.io/downloadsからanaconda本体をダウンロードしてくる。
ダウンロードが終わればシェルを実行して
# if you use python 3.5 bash Anaconda3-4.2.0-Linux-x86_64.sh # if you use python 2.7 bash Anaconda2-4.2.0-Linux-x86_64.sh
で完了だ。
続いて仮想環境を構築する。ENV_NAMEは仮想環境の名前だ
$ conda create -n ENV_NAME python=2.7 anaconda # enter virtual environment $ source activate ENV_NAME $ python -m pip install --upgrade pip
OpenCVインストール
$ conda install -c anaconda numpy=1.11.1 $ conda install -c menpo opencv3=3.1.0
一瞬である。
構築の確認
import numpy as np import cv2 cv2.__version__
これの結果が3.1.0と出てきたら成功だ。
環境構築 (C++編)
どちらかというと本番はこっち、C++はPythonほど便利な環境やツールが残念ながらそろっていない(まあかなり低レベルな言語だし)
鬼のインストールシェル
というわけで頑張ってwgetでソースを落としコンパイルするということになる。
インストール先ディレクトリは、標準の/usr/local/libである。
$ cd /usr/local/lib/ $ ls $ mkdir opencv $ cd opencv/ $ wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/3.1.0/opencv-3.1.0.zip $ unzip opencv-3.1.0.zip $ sudo apt-get update $ sudo apt-get install build-essential libgtk2.0-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev cmake python-dev python-numpy python-tk libtbb-dev libeigen3-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev libqt4-dev libqt4-opengl-dev sphinx-common texlive-latex-extra libv4l-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev default-jdk ant libvtk5-qt4-dev checkinstall $ ls $ cd opencv-3.1.0/ $ mkdir build $ cd build/ $ #インストール先にディレクトリを変更する場合はCMAKE_INSTALL_PREFIXの値を変更する $ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D WITH_FFMPEG=OFF -D WITH_CUDA=OFF -D BUILD_opencv_python2=ON $ #/usr/local下以外にインストールするときは以下のパスを通す $ # PKG_CONFIG_PATH=$HOME/local/opencvlibrary/lib/pkgconfig:$PKG_CONFIG_PATH $ # export PKG_CONFIG_PATH $ # LD_LIBRARY_PATH=$HOME/local/opencvlibrary/lib:$LD_LIBRARY_PATH $ # export LD_LIBRARY_PATH $ # $ ~/.profile $ vi ~/.profile $ #-jは並行オプションなので数字はコア数に合わせる $ make -j4 $ sudo make install $ source ~/.profile $ sudo checkinstall $ #ディレクトリは適宜変更する $ sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf' $ sudo ldconfig $ sudo cp 3rdparty/ippicv/unpack/ippicv_lnx/lib/intel64/libippicv.a /usr/local/lib $ sudo cp ../3rdparty/ippicv/unpack/ippicv_lnx/lib/intel64/libippicv.a /usr/local/lib
見ただけで死にたくなるようなシェルの量である…こんなん覚えるのムリ…って感じである。
ちなみに、cmakeの部分で"WITH_CUDA=OFF"オプションを付けているが、これはCUDA側のバージョンが古いと(具体的な数字は失念してしまった…)CUDA側のバグでインストールできなくなってしまうので、CUDAを使う予定のない方は、なるべく切っておくことをお勧めする。使う方はCUDAを最新版にアップデートしてからインストールした方がよい。
構築確認
以下のソースをコンパイル、実行する
#include <iostream> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> using namespace cv; using namespace std; int main( int argc, char** argv ) { cout << "OpenCV version : " << CV_VERSION << endl; cout << "Major version : " << CV_MAJOR_VERSION << endl; cout << "Minor version : " << CV_MINOR_VERSION << endl; cout << "Subminor version : " << CV_SUBMINOR_VERSION << endl; }
$ g++ -ggdb `pkg-config --cflags opencv` -o `basename testcv.cpp .cpp` testcv.cpp `pkg-config --libs opencv` $ ./testcv
今日はこんなところでおしまい…!
たくさんデバイスを一気に管理したいときに -SuperPutty-
どうも、お久しぶりすぎますね。
生きてました。
何を思ったか巷で噂のAdvent Calenderを勝手にやってみようと思いまして、なんとなーく書いています。
SSHをwindowsでやる話
皆さんサーバなり何なりの操作でSSHを使うことがありますよね?
Macの場合普通にターミナルからSSHコマンドを叩くことになると思いますが…
でもwindowsの場合、なかなか直接コマンドプロンプトを叩くことはせずに
* TeraTerm
* Putty
のどちらかのソフトを使って叩いていることが多いですよね?
でも、それらのソフトはUIなんて二の次どころの騒ぎで収まっていないので、複数の端末を同時に触りたいとか、そういうことあってもシームレスに切り替えられない現状があります…
そこで登場SuperPutty
はい、素晴らしい
たくさんのターミナルを自由に複数配置できます。
右側のサイドバーによく使う端末の設定を保存したり、従来のPuttyの設定のインポートができたりするのでとても重宝します。
僕みたいに研究で一気にターミナル6台開かなきゃいけない…とかそういう人にはマジでおすすめです!!
こちらからダウンロードできますので、ぜひ皆様活用を…!
https://github.com/jimradford/superputty/releases/tag/1.4.0.8
eclipseからAndroid Studioに乗り換えて戸惑った時のためのメモ
久しぶりの投稿になってしまった。三日坊主癖が治らない…
実は管理人、前にpahoとかの話をしておきながら長いこと(数年くらい?)Androidプログラミングから離れてたのである。
その間にAndroidでよく使われているバージョンは2.xから4.xや5.xになっていたり、メイン開発手法はeclipse+ADTからandroid studioになっていたりで浦島太郎状態というのが本音である。
とゆーわけで今回は、eclipse+ADTからAndroid Studioに乗り換えた管理人がハマったことをピックアップしておく
プロジェクト≠フォルダ構成
普通eclipseの場合はプロジェクトエクスプローラを開くとエクスプローラのフォルダ構成と概ね一致する。
しかしandroid studioの場合は
ちょっと異なるのだ。
"java"や"manifests"とかいう作った覚えのないフォルダにリソースが入るし、drawableは統一され、libsフォルダなどは見えなくなっている。
特にlibsとかをいじろうとしたときに管理人のようなandroid studio初心者は一瞬戸惑ってしまう。
そんなときの解決方法はこれだ。
左上のAndroidを「プロジェクト」に変更すると、eclipseのプロジェクトエクスプローラと概ね一緒になる。これで一安心だ。
今まで通りソースコード整形ができない
ソースコード整形のショートカットキーがIDEごとに異なるのはよくある話(eclipseとVSとか)だが、どうしてもeclipseから乗り換えた場合、癖でCtrl+Shift+Fを押してしまう。
android studioの場合はCtrl+Alt+Lが正しい。
見つからないアウトライン
eclipseで地味に管理人が助かっている機能が「アウトライン」だ。
永いソースコードを読むときの要点、まさにアウトラインを読むときには非常に重宝していた。
しかしそれがandroid studioでは見つからない…
android studioの場合はCtrl+F12で一時的に表示できるようだ
ただし今までのようにウィンドウに固定する方法はわかってない。管理人としてはすごく固定したいのだが…
右クリックで囲めない…!!
eclipseユーザなら大抵の人がお世話になっているであろう機能が、右クリックからの「囲む→try/catch」だろう。管理人も初めて使ったときは驚きを隠せなかった。
しかしandroid studioではこれを右クリックでは実現できない。
これを実行するにはCtrl+Alt+Tでできる。
以上、今まで戸惑って解決したところはこんなところである。
ちなみにまだ管理人が解決していない部分もある。
それは、android studioでは「インポートの自動編成」を思ったように使えない。
eclipseでは気軽に使えて便利だったのに…
また調べてくる所存である。
MQTTbrokerを構築してMQTTを試してみる
前回こんな記事を書いた3116pitchdarktech.hatenadiary.jp
とゆーわけで、今回はMQTTのもう一つの要素、brokerを構築する。
今回は、MQTTでは非常に有名なbrokerであるmosquittoを利用する。
brokerの構築
でもこれはすごく簡単。ノープログラミングで行ける。
用意するのはUbuntu、ターミナルを起動して以下のコマンドを打てばいい
sudo apt-get install mosquitto sudo service mosquitto start
以上。
非常に簡単である。
動かしてみる。
前回行ったMQTTクライアントプログラムを使って実験してみる。
- clientID:名の通り、特別な設定をしなけれは特に認証などに使うわけではないので、適当に入れればよし
- server:サーバーのURLまたはIPを突っ込む
- port:ポート番号、MQTTのデフォルトは1883
これでconectすると次はこんなんになる。
- Topic:トピック名の入力
- Message:メッセージの内容を入力
- QoS:3段階から入力
- Retained:必要であればチェック
で、publishすると送信ができる。
同じようなことをやってsubscribeすると
管理人がまだあまり理解していないので滅茶苦茶な履歴になってしまったが、メッセージの受信は確認できた。
今日はここまで
Android向けpahoライブラリを使えるようにしてみた
最近MQTTというプロトコルが注目されており、市場が伸びるといわれているIoTの世界で特に期待されている。
というわけで、管理人もちょっと手を出してみた。
MQTTを用いてプログラムを実装する際、クライアントサイドではpahoというEclipseプロジェクトのライブラリを用いることが一般的っぽい。今回はAndroidを相手に実装したかったのでそれのインストールメモをここに書く
はっきり言おう。すごく厄介だったと
ちなみに管理人はWindowsを使っていて、開発環境もWindowsなのだが、面倒になって一部にLinuxを併用した…
ライブラリそのものを持ってくる
Gitコマンドで持ってくる
管理人はWindowsのコマンドプロンプトにGitを入れていなかったため、SourceTreeのターミナルを使った(たぶん本来の使い方ではない)
git clone http://git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.java.git
これでインストールしてくると、多数のソースファイルがインストールされる。
で、これをビルドしてjar(org.eclipse.paho.client.mqttv3-1.0.1.jar , org.eclipse.paho.android.service.jar)を生成し使っていくのが本来の使い方なのだが…
ビルドできなかった
まあ自分の技術力のなさもあるのだろうが…
というわけで別の手を使う。
jarの一部はネットにあるらしい
ここでLinuxの出番。
org.eclipse.paho.client.mqttv3-1.0.1.jarはどうやら落とせるらしいので、コマンドをターミナルにぶち込む
sudo apt-get install curl curl -O https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho.client.mqttv3/1.0.1/org.eclipse.paho.client.mqttv3-1.0.1.jar
で落としたjarを必要なところに持ってこればよし
問題のもう一つのjar
なんとかEclipseでビルドができる…かもしれないということで、
EclipseにADTを追加し、org.eclipse.paho.android.serviceプロジェクトをインポートする
このプロジェクトにlibsフォルダを作り、先ほどのorg.….mqttv3-1.0.1.jarと、support-v4-r7.jarというものを持ってくる。
ちなみにsupport-v4-r7.jarはここにあるっぽい
http://mvnrepository.com/artifact/com.google.android/support-v4/r7
で、あとはexportjar.xmlを書き換える必要があるのだが、ここが本当に曲者
まずは、androidjarのプロパティを
<property name="androidjar" value="ADTのディレクトリ/android-tools/sources/android-19" />
に変更し、
javacの設定(真ん中1行)のclasspathの部分を
<target name="buildFiles" depends="init"> <!--省略--> <javac deprecation="on" debug="on" encoding="${classes.encode}" srcdir="${src}" destdir="${classes}" classpath="(android.jarまでの絶対パス)\android.jar;(support-v4-r7.jarまでの絶対パス)\support-v4-r7.jar;(org.eclipse.paho.client.mqttv3-1.0.1.jarまでの絶対パス)\org.eclipse.paho.client.mqttv3-1.0.1.jar;" includeantruntime="false"/> <!--省略--> </target>
とゆー風に絶対パス3つに書き換える
はっきり言おう。
めっちゃ頭悪い書き換えだ
ただ、とりあえずこれ以外で成功しなかった。誰かいい方法あったれ教えてくれ。
とりあえず、これでプロジェクト内distフォルダにorg.eclipse.paho.android.service.jarが作成される。
MQTTのプログラムをこれらを使って動かしてみる
今回はgitで落としたソースについてきたorg.eclipse.paho.android.service.sampleプロジェクトを使う。
例によってlibsフォルダに目的のjar2つをいれ、起動
動いた。よかった…
今日はここまで
お世話になったサイト様
流行りの技術を体験してみた~How-Old.net ~
はいこれ。
How-Old.netという顔画像から年齢を推定するサイトだ。
実はこれ、適当な人がやっているのではなく、マイクロソフトの中の人が「お遊び」で作ったサイトらしい。
webページでAndroidのマテリアルデザインを作れる「Polymer」について
このご時世は「モバイルファースト」とか叫ばれており、スマホやタブレットでネットに接続するのはもはや当たり前の時代になってきている。
また、HTML5,css3,jsの発展で「webアプリ」なる、webページ上でアプリケーションを動かしてサービスを提供する形態も増えてきている。
…つまりモバイル対応webアプリを作ろう!!という流れは多分に想像できるが、一方で
そんなデザインちゃっちゃと作って実装できるわけないだろ
という心の叫びを出したくなる人がいる*1のも事実である。
そんな人たちの助けとなるのが、Polymerである。
What's Polymer?
Polymerは、およそ1年前のGoogleI/Oで発表されたマテリアルデザイン*2と共に出てきたwebページのフロントエンドフレームワークである。
つまり、Android5.x系の「マテリアルデザイン」をwebページ上で実現できるフレームワークなのである。
これを使えばデザインセンスダメダメの管理人でも、今風デザインのモバイル対応webアプリを作れるということである。
Let's Polymer!!
このサイトに結構Polymerの使い方が書いてある。dev.classmethod.jp
というわけで管理人も実装…しようと思ったが例によってこの辺で力尽きたので、GWにでも持ち越そうと思う。(意識低い
*1:俺とか俺とか俺とか
*2:わからん人はこの辺でも http://gigazine.net/news/20150316-best-of-material-design/