粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

Ubuntu16.04 LTSにOpenCV3.1をインストール から顔認識のテストまで

長らく眠っていたUbuntu使用のレッツノートですが、
最近試したいことが増えたので徐々に出番が増えてきています。
現時点(2017年1月)での最新バージョンであるOpenCV3-1-0を入れて動作確認するまでをメモします.

追記:より良いプログラミング環境のために

個人的に初学者がOpenCVを単体でインストールするのはきちんとした目的がない限りあまりお勧めできません.

Pythonで開発したいのであればAnacondaを使って他のパッケージとまとめてインストールするのが良いです.以下,Windows版の記事ですがUbuntuでもほぼ同じ工程をたどります.
ossyaritoori.hatenablog.com

また,Robot制御に興味関心があるのであればROSを入れることでもOpenCVのパッケージは勝手にダウンロードされます.
ossyaritoori.hatenablog.com


これらとは別にOpenCVを入れる動機としては現状,

  • 最新のOpenCVを使ってC++で高速なコードを書きたい.

といった局所的なものになるかと思います.なお,本記事のサンプルコードはどちらの環境でもきちんと動くはずです.(Python2,3系の修正は必要かも)

環境

Ubuntu 16.04.1 LTS
PC:64bit メモリ:8G

Python 2.7.12

所要時間

所要時間は 10分〜30分前後を見たほうがいいと思います。
ダウンロードとmakeのどちらもそれなりに時間がかかります.

インストールファイルの準備

ほぼすべて、以下のブログの手順通りです、
OpenCV3.1.0のインストールメモ (Ubuntu 14.04 LTS) - umejanのブログ

zipの入手

最初のディレクトリは好きに選んでください。とりあえずDownloadsに入れました。
今思えばhome直下に作ってもよかった。

cd ~/Downloads
wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/3.1.0/opencv-3.1.0.zip
unzip opencv-3.1.0.zip

requirement のインストール

詳細はよくわかってません、とりあえず言うとおりにしておきましょう。
時々新しいバージョンを求められるので、適宜書き換えて使ってください。

sudo apt-get install build-essential libgtk2.0-dev libjpeg-dev libtiff5-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

cmakeによる環境の構築

人によってはcmakeのコマンドが入っていないことも多々あるのでまずはターミナルでcmakeと打ってみてください。
ダメなら表示の指示にしたがってコマンドをインストールすることから始めます。

必ず、opencv-3.1.0のディレクトリに移動してから以下のコマンドを順々に実行していってください。
エラーが出る場合はだいたいがパッケージがないからなので、適宜apt-getしてください。

僕の場合はcheckinstallなんかが引っかかりました。
こいつはいろいろ要求してきましたが大体言うとおりにした結果うまく行っています。
責任は取りませんけどね!

mkdir build
cd build
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 BUILD_opencv_python2=ON ..

make -j4
sudo make install
sudo checkinstall
sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
echo "OpenCV ready to be used"

ldconifgを行ったあとで以下のような画面がでて完了かと思います.
f:id:ossyaritoori:20170622183850p:plain

最後に:cv2.soの移動/ Pythonへの認識のさせ方

/usr/local/lib/python2.7/site-packages/
にcv2.soがないらしいので(?)以下の操作をします。
これをするしないでそこまで変化があるかは謎です。確かに上記ディレクトリにはなにも存在しなかったので
一応言うとおりにしています。

sudo cp ~/Downloads/opencv-3.1.0/build/lib/cv2.so /usr/local/lib/python2.7/site-packages/

追記:二度目の環境ではいろいろと変更が加わっていたため違う感じになっていました.
まず,Importを行うとrosのdist-packagesにcv2がないと怒られたので以下のようにしました.

sudo cp ~/opencv-3.1.0/build/lib/cv2.so  /opt/ros/kinetic/lib/python2.7/dist-packages/

動作確認

pythonを起動し以下のように打ち込んで結果を得たらとりあえずはインストール終了と言えるでしょう。

>>> import cv2
>>> cv2.__version__
'3.1.0'

OpenCV3系列を入れたのにimportに書くのはcv2のようです.
どういう意味でしょうね?

インストール後のテストコード

画像のOpen

テストコード実行できればもっと安心ですね。
lenaさんの画像は以下からどうぞ
f:id:ossyaritoori:20161021033709p:plain

import cv2
img = cv2.imread('lena.jpg')
cv2.imshow('img',img)
cv2.waitKey(0)

顔認識

もっと進んだテストがしたい方はこちら。
lenaさんの顔を認識して顔の付近を赤く囲むプログラムです。
実に簡単にかけますね、素晴らしい。

#coding: utf-8

import cv2
import numpy as np

faceCascade = cv2.CascadeClassifier('~/Downloads/opencv-3.1.0/data/haarcascades/haarcascade_frontalface_alt.xml')

img = cv2.imread('lena.png', cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face = faceCascade.detectMultiScale(gray, 1.1, 3)

# write rectangle in detected face
if len(face) > 0:
	for rect in face:
		cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (0, 0,255), thickness=2)
else:
	print "no face"

cv2.imshow('detected',img)
cv2.waitKey(0)
cv2.imwrite('detected.png', img)

トラブルシューティング

error: (-215) !empty() in function detectMultiScale

と出る場合は” faceCascade = cv2.CascadeClassifier('~/Downloads/opencv-3.1.0/data/haarcascades/haarcascade_frontalface_alt.xml')”
のpathが間違っているので絶対pathで書き直すか、ファイルそのものを同じディレクトリに持ってきてください。

結果:
f:id:ossyaritoori:20161021054958p:plain



初めて自分の環境で書くpythonです(雑魚)
こうしてみると楽ちんでいいですね。python
実行速度さえなんとかなればな〜。ビデオ版使ってみた感じいうほど遅くないですね。
これが風評被害ってやつか。

Webカメラでリアルタイムに顔認識

Webカメラを繋いで検知するバージョンです。
マルチスレッド化したのも以下の記事に書きました。
ossyaritoori.hatenablog.com

#encode: utf-8 
# large part of this source code is from here
# http://qiita.com/Algebra_nobu/items/a488fdf8c41277432ff3

import cv2
import os

# cascade 
cascade_file = "/home/yoshiri/Downloads/opencv-3.1.0/data/haarcascades/haarcascade_frontalface_alt2.xml"

#get feature point
cascade = cv2.CascadeClassifier(cascade_file) 

# Capture from camera
cap = cv2.VideoCapture(0)

color = (255, 255, 255) # white

while(True):

    # get frame from video stream
    ret, frame = cap.read()

    #face recognition
    facerect = cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))

    for rect in facerect:
        # put rectangle
        cv2.rectangle(frame, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), color, thickness=2)

     # show
    cv2.imshow("Show FLAME Image", frame) 

    # end after 'q' pressed
    k = cv2.waitKey(1)
    if k == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

なんかおかしいな?と思ったら

OpenCVあるあるですがここでpathが通っていないと何もできません
サンプルコードを実行するためにはPATHを通しましょう。

困った場合は以下のページなんかがとっても親切です(バージョンこそ違いますが)
Ubuntu 14.04 LTSにOpenCV2.4.11をインストール | ShumiLinux

Path の通し方

ターミナルにて以下のコマンドを打つことで

PATH= $PATH: 追加したいPath
export PATH

PATHは:(半角)を使って追加してください。

起動時に自動的にPATHに追加

ここからはバージョン依存の話ですが、
上記のコマンドを起動時に毎回するのは面倒です。

実はhomeディレクト以下に.bash_profileというファイルが存在し、
そのファイルの末尾に先ほどの二行を加えることで自動的に実行させることができます。

ただし、Ubuntu14.04以降は.bash_profileの代わりに
.profileになっていますので間違いのないように。

最終的にはpkg-configのところとlibのところをPATHに追加する必要があります。

参考になりそうな書籍

もしPythonを使うのであれば以下の本が基礎からわかってオススメです。
オライリーは原文の方がいいですが和訳版もまぁまぁ実用的ですね。

実践 コンピュータビジョン

実践 コンピュータビジョン

そんでもってDeepLearningの本も載せておきます。これも同様のPython環境で遊べるので初学者にはもってこいでしょう。

以上宣伝コーナーでした。

追記:PC環境再構築

PCをSSDに移行する際にデータのみ移行したのですが,やはり依存関係が不明なのか再セットアップに迫られました.
cmakeの部分より以降をもう一度実行することで解決した模様です.
やはりSSDは早い.