粗大メモ置き場

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

ROSとの競合を避けながらUbuntuでOpenCV環境を再構築

anacondaでいろいろ設定した後にrosを入れるとpythonの環境が複数存在することになって非常に面倒なことになったというお話です.
SSD移行前と手順が違うので以下の過去記事とは完全に別物だと思ってください.
ossyaritoori.hatenablog.com

環境

Ubuntu16.04
Python 3.5.2(Anaconda使用)

Anaconda を用いたOpenCVのインストー

適当に

conda install -c https://conda.binstar.org/menpo opencv3

としてOKです.
Windows Anaconda Python 3.5 への OpenCV 3.1 のインストール - にせねこメモ

私はこの後rosを入れたためトラブルに見舞われました.

エラー状況

インストールの確認のため,

import cv2

とした際に,「ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type」と出る.

以下のようにrosをいれたことによってpythonのパッケージ参照の優先度が変わったためのようです.
stackoverflow.com

1.Pythonの環境を調べる

import sys
sys.print

これでPathが出てきます.すると出るわ出るわ.
このようにrosのdist-packageが優先になっています.

'', '/opt/ros/kinetic/lib/python2.7/dist-packages', '/home/userx/anaconda3/lib/python35.zip', '/home/userx/anaconda3/lib/python3.5', '/home/userx/anaconda3/lib/python3.5/plat-linux', '/home/userx/anaconda3/lib/python3.5/lib-dynload', '/home/userx/anaconda3/lib/python3.5/site-packages', '/home/userx/anaconda3/lib/python3.5/site-packages/Sphinx-1.4.6-py3.5.egg', '/home/userx/anaconda3/lib/python3.5/site-packages/setuptools-27.2.0-py3.5.egg'

なお,user名はuserxでぼかしています.ご了承を.

これがどういう手順で入っているかは以下の長い解説をご確認を.
Python の module search path ついて調べてみる - Lostman

Where is Python's sys.path initialized from? - Stack Overflow

一時的解決策:sys.pathの順番変更

私のpython環境ではAnacondaを用いた3.5系だったのでパッケージはsite-packagesの直下にあります.
従ってこれを再優先させることでAnacondaで入れたopencvのパッケージを反映することができます.

import sys
sys.path.insert(0,'/home/userx/anaconda3/lib/python3.5/site-packages')

PYTHONPATHを変更する

このように一時的に回避することは可能ですが,Python環境を立てなおした場合にはこの操作は無効になってしまいます.

PYTHONPATH(環境変数みたいなもの)を変更することでこの問題を回避することが可能ですが,これまた再起動すると変更が取り消されてしまいます.

export PYTHONPATH=/home/userx/anaconda3/lib/python3.5/site-packages:$PYTHONPATH

PYTHONPATHを永久的にいじれるようにする

「各自使用するshellを確認するように」という前書きがつきますが,私のように気にしたことのない人のほうが多いでしょう.
以下のような文を~/.bashrcに追加しましょう.(user名の置換を忘れずに)

export PYTHONPATH="/home/userx/anaconda3/lib/python3.5/site-packages:$PYTHONPATH"

他の記述の影響を受けないように最後行に書くのが良いと思います.

その後この反映をすぐに実行するには

source ~/.bashrc

として実行してください.

ja.stackoverflow.com

テストコード置き場

顔認識(静止画・動画・マルチスレッド)


キャリブレーション

imagesという名前のフォルダ内にjpgで撮影画像を入れておくと勝手にキャリブレーションを行ってくれるように書きました.
rms誤差とカメラ行列K,歪み行列をcsv形式で同時に保存しています.

なおキャリブレーションに用いたチェッカーボードの画像がなかなか手に入らないのでここにおいておきますw
http://opencv.jp/sample/pics/chesspattern_7x10.pdf
なお,縦横比がA4と少し違うので原寸で印刷することを忘れずに!