Raspberry Pi 3 Model B+とOpenCVで すきまを測定したい #1

こんにちは かずまなぶです。(‘ω’)

モノとモノの隙間

モノとモノの隙間を測定するときに、ものさしとかノギスとかを使いますが、画像で測定できないかなと思い、押し入れに眠っているRasbery pi3 B+とOpenCVと3.5インチの小型タッチパネルを使って、ハンディな測定器を作れないか検討しはじめました。

手順は下記の通り考えています。

手順

  1. Rasbery piのOSインストーラーをwindows端末からwebにアクセスしてゲット。
  2. OSインストーラをマイクロUSBにコピーし、Rasberypiに指して起動してOSをインストール
  3. 初期設定:IP addr 固定 , ネットワーク接続 , カメラ有効化 , SSH有効化  
  4. OpenCVに必要なライブラリなどをインストールする
  5. OpenCVをインストールする
  6. カメラを接続して、写真を撮る
  7. 撮った写真をOpenCVで画像処理して輪郭検出
  8. 「実スケールの基準物体」と「輪郭検出した画像のエッジ間ピクセル数」との校正曲線を作成する。
  9. 上記輪郭検出によるエッジ間距離を校正曲線によって実スケールに変換する。
  10. 検出したエッジ間距離を表示する。
  11. 番外:タッチパネルを使ってみる
  12. 番外:SSHを使ってみる

事前準備が長いのですが、やっていきましょう。つまずいたらコメント欄から助けてください。(*’▽’)

1.Rasbery piのOSをwindows端末からwebにアクセスしてゲット。

https://www.raspberrypi.org/downloads/noobs/
ここから Rasbianのインストーラをダウンロードする

まずは、上記webサイトからラズパイ用のOSであるRasbianのインストーラをダウンロードしましょう。今回はNOOBSというRasbian+αのインストーラを使います。

NOOBS 「ダウンロードZIPをダウンロード」ボタンを押します。NOOBS Liteの方ではありませんので注意です。1.6GB 10分弱くらいかかりました。 →ダウンロード開始

 

2.OSインストーラをマイクロUSBにコピーして、Rasberypiに指して起動

ダウンロードしたファイル NOOBS_v3_0_0.zip を解凍してマイクロUSBにコピーして、ラズパイに挿します。

ラズパイを起動するとウィザードが立ち上がるので、NOOBSをインストールします。

 

3.初期設定:IP addr 固定 , ネットワーク接続 , カメラ有効化 , SSH有効化

この時点ではwifiを切断しておくこと。

①SSHの有効化(外部端末での接続設定)
メニュー>ラズパイの設定>インターフェイス>SSH有効>OK

ついでに一緒にカメラ有効にもチェックを入れておきましょう。

②IPアドレスの固定
メニュー>wirelessアイコンを右クリック>Wireless & Network Preferences
Configure>SSID
Automatically configure empty options>チェックを外す

IPv4 = 192.168.1.81/24 →81のところは好きな数字で良い
Router = 192.168.1.1
DNS Servers = 192.168.1.1

③wifiの接続
wifi>選択>パスワードを打つ

④固定アドレスになっていることを確認する
ip addr → inet 192.168.1.81

これでSSHからの接続ができる(はずなんですが!!できませんでした!)

⑤Puttyをwindows端末にインストールして、192.168.1.81にSSHでアクセスする。

→できませんでした。time outになります!!助けてください!

4.OpenCVに必要なライブラリなどをインストールする

 

SSHができなくても、何ら問題はないのでOpenCV関連をインストールして行きましょう。

Contents

インストール済みのパッケージをアップデートする。

何回か繰り返さないと完全にアップデートできませんでした。

私は アップデート2回→アップグレード1回で終わりました。1回目は結構時間がかかります。

cmake関係のインストール

 (コンパイラに依存しないビルドの自動化)
sudo apt-get install build-essential cmake pkg-config

画像の入出力用のパッケージをインストール

 

動画の入出力用のパッケージをインストール

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264
↑エラー発生 E: パッケージ libx264 が見つかりません

GTKをインストール(OpenCV のhighguiモジュールに必要)

sudo apt-get install libgtk2.0-dev

OpenCVの行列演算パッケージをインストール

sudo apt-get install libatlas-base-dev gfortran

Python 2.7とPython 3のヘッダファイルをインストール

sudo apt-get install python2.7-dev python3-dev

python2.7-dev はすでに最新バージョン (2.7.13-2+deb9u3) です。
python3-dev はすでに最新バージョン (3.5.3-1) です。

5.OpenCVをインストールする

OpenCVのソースコードをダウンロードして、解凍する

wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.1.0.zip
unzip opencv.zip

OpenCVの追加機能のソースコードをダウンロードして、解凍する

wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip
unzip opencv_contrib

解凍したソースコードを下記ディレクトリの中に入れる(まとめておく)

ディレクトリ:/home/pi/Library/opencv/

pipをインストール

wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py

virtualenvとvirtualenvwrapperをインストール

sudo pip install virtualenv virtualenvwrapper
sudo rm -rf ~/.cache/pip
↑なんか消す

vimをインストール

sudo apt-get install vim

vimで /home/pi/.bashrcを開く

[a]キーで行末に追記モード
下記8行を行末に追加する。
escapeキーで追記モードを抜けて :wqでファイルに保存する。

慣れてないと、なんでこんな操作方法にしたのか、意味不明に思います。

#virtualenv and virtualenvwrapper

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.5
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS=’–no-site-packages’
source /usr/local/bin/virtualenvwrapper.sh

ここまで

今編集した /home/pi/.bashrcを実行

source ~/.bashrc

一旦リブートしておく

sudo reboot

※2019.3.24現在、以下の仮想環境作成が動作しなくなりました。

替わりに、この時点で再度ターミナルを開いて下記のコマンドを打つと、OpenCVがインストールされました。(注:でもやってはだめです。)

sudo apt-get install python-opencv

しかし、この方法ではpython2のほうに古いopenCVが入ってしまい、python3でインポートしようとしてもエラーになります!!

解決策;

ひとまず仮想環境の構築はあきらめます。

作成したディレクトリ /home/pi/Library/opencv/のさらに下、

解凍したopencv-3.1.0に入ります。

下記のコードでターミナルから操作しましょう。

 

cd opencv-3.1.0
mkdir build-python3
cd build-python3

そして、

cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules \
-D BUILD_EXAMPLES=ON \
-D BUILD_opencv_python2=ON \
-D BUILD_opencv_python3=ON \
-D WITH_FFMPEG=ON \
-D ENABLE_PRECOMPILED_HEADERS=OFF ..

そしてビルドします

make

このとき、makeの後ろにはなにもつけません。-j4をつけて CPUをフルでまわすと、とんでもない灼熱になり、ハングアップしてしまいます。

なにもつけなければ、1コア使用することになり、全部で4コアありますから25%のCPU使用量です。8時間くらいかかりました・・・

 -j2をつけて、2コアの50%でもよかったかもしれません。

続いて、インストールします
sudo make install

そして共有ライブラリの更新
sudo ldconfig

確認のために python3からimport cv2しましょう。エラーが出なければOKです。

超重要:このあと、openCVでカメラを起動しようにもできませんでした。

シェルコマンドではraspistillとかいうやつで起動できるのですが、cv2.VideoCapture(0)が機能しません。

ここではラズパイ専用カメラをしようしているので、一般的なwebカメラとして認識できるように下記のコードを実行することが必要でした。

注意点としては 最後の部分は 「ぶい よん える に」 です。

「ぶい よん いち に」 だと思って奮闘してしまいました。

sudo modprobe bcm2835-v4l2

最後に、テストコードを記載しておきます。これで動けばOKです。

 

以上より、これ以降の記事は捨てます。

仮想環境を作成する 名称:cv-python3の場合

mkvirtualenv cv-python3 -p python3

作成した仮想環境に入る

worken cv-python3 -p python3

成功すると(cv-python3) pi@raspberrypi:~ $ になる

仮想環境から抜けるとき(まだやらなくていい)

deactivate

作成した仮想環境を削除する(まだやらなくていい)

rmvirtualenv

numpyをインストール(仮想環境)

pip install numpy

OpcenCVをコンパイルしてインストールする(仮想環境)

workon cv-python3
cd opencv-3.1.0
mkdir build-python3
cd build-python3

cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules \
-D BUILD_EXAMPLES=ON \
-D BUILD_opencv_python2=ON \
-D BUILD_opencv_python3=ON \
-D WITH_FFMPEG=ON \
-D ENABLE_PRECOMPILED_HEADERS=OFF ..

ビルドする

make

インストール
sudo make install

共有ライブラリの更新
sudo ldconfig

ファイル名をわかりやすいように変更する

cd /usr/local/lib/python3.5/site-packages/
sudo mv cv2.cpython-35m-arm-linux-gnueabihf.so cv2.so

共有ライブラリから仮想環境の共有ライブラリにリンクさせる

cd ~/.virtualenvs/cv-python3/lib/python3.5/site-packages/
ln -s /usr/local/lib/python3.5/site-packages/cv2.so cv2.so

OpenCVの起動をテストする

workon cv-python3
python3

import cv2
cv2.version

‘3.1.0’

ここでいったん休憩しましょう。いやー長すぎですよね!次回はOpenCVを使って輪郭検出をやっていきましょう。