漆黒な技術メモ

管理人が必要に応じて自分のメモを好き勝手に投下するたまり場的ブログ

【ちょっと技術的なこと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を勝手にやってみようと思いまして、なんとなーく書いています。

SSHwindowsでやる話

皆さんサーバなり何なりの操作でSSHを使うことがありますよね?
Macの場合普通にターミナルからSSHコマンドを叩くことになると思いますが…
でもwindowsの場合、なかなか直接コマンドプロンプトを叩くことはせずに
* TeraTerm
* Putty
のどちらかのソフトを使って叩いていることが多いですよね?
でも、それらのソフトはUIなんて二の次どころの騒ぎで収まっていないので、複数の端末を同時に触りたいとか、そういうことあってもシームレスに切り替えられない現状があります…

f:id:igbt3116redtrain:20161202231735p:plain

そこで登場SuperPutty

f:id:igbt3116redtrain:20161202235604p:plain はい、素晴らしい
たくさんのターミナルを自由に複数配置できます。
右側のサイドバーによく使う端末の設定を保存したり、従来の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の場合は
f:id:igbt3116redtrain:20150605030245p:plain
ちょっと異なるのだ。
"java"や"manifests"とかいう作った覚えのないフォルダにリソースが入るし、drawableは統一され、libsフォルダなどは見えなくなっている。
特にlibsとかをいじろうとしたときに管理人のようなandroid studio初心者は一瞬戸惑ってしまう。
そんなときの解決方法はこれだ。
f:id:igbt3116redtrain:20150605030716p:plain
左上のAndroidを「プロジェクト」に変更すると、eclipseのプロジェクトエクスプローラと概ね一緒になる。これで一安心だ。

今まで通りソースコード整形ができない

ソースコード整形のショートカットキーがIDEごとに異なるのはよくある話(eclipseとVSとか)だが、どうしてもeclipseから乗り換えた場合、癖でCtrl+Shift+Fを押してしまう。
android studioの場合はCtrl+Alt+Lが正しい。

見つからないアウトライン

eclipseで地味に管理人が助かっている機能が「アウトライン」だ。
f:id:igbt3116redtrain:20150605031734p:plain
永いソースコードを読むときの要点、まさにアウトラインを読むときには非常に重宝していた。
しかしそれがandroid studioでは見つからない…

android studioの場合はCtrl+F12で一時的に表示できるようだ
f:id:igbt3116redtrain:20150605032106p:plain
ただし今までのようにウィンドウに固定する方法はわかってない。管理人としてはすごく固定したいのだが…

右クリックで囲めない…!!

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クライアントプログラムを使って実験してみる。
f:id:igbt3116redtrain:20150516022926p:plain

  • clientID:名の通り、特別な設定をしなけれは特に認証などに使うわけではないので、適当に入れればよし
  • server:サーバーのURLまたはIPを突っ込む
  • port:ポート番号、MQTTのデフォルトは1883

これでconectすると次はこんなんになる。
f:id:igbt3116redtrain:20150516022940p:plain

  • Topic:トピック名の入力
  • Message:メッセージの内容を入力
  • QoS:3段階から入力
  • Retained:必要であればチェック

で、publishすると送信ができる。
同じようなことをやってsubscribeすると
f:id:igbt3116redtrain:20150516022907p:plain
管理人がまだあまり理解していないので滅茶苦茶な履歴になってしまったが、メッセージの受信は確認できた。

今日はここまで

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つをいれ、起動f:id:igbt3116redtrain:20150512012945p:plain
動いた。よかった…

今日はここまで

お世話になったサイト様

minor.hatenablog.com

流行りの技術を体験してみた~How-Old.net ~

はいこれ。

How Old Do I Look?

How-Old.netという顔画像から年齢を推定するサイトだ。
実はこれ、適当な人がやっているのではなく、マイクロソフトの中の人が「お遊び」で作ったサイトらしい。

どーゆー技術か

簡潔に言うと、機械学習による推定である。
誤解を恐れずに言うと、機械学習とは『「説明変数(入力)」と「目的変数(出力)」のペアをいくつか学習させておくことで、説明変数を入力した際に目的変数を予測する』という技術である。

マイクロソフトクラウドサービス「Azure」の中で機械学習コンポーネントを提供してて、その中に「Face API」なる顔検出のAPIがあり、その宣伝を兼ねて作ったものらしい。

管理人はAzure全然さっぱりなのでこれ以上の説明は避けておく←

実際に推定してみた。

管理人(21歳)を測定した結果
f:id:igbt3116redtrain:20150502005639p:plain
かなり老け顔と判定されました
つらい


ちなみにこのページについて詳しく知りたい人は、マイクロソフト公式リリース文を一応出してはいるので読んでみてはいかがだろうか(英語だけど)

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/