Python:webカメラとOpenCVで動体検知してLine Notifyで画像を通知する

こんにちは Keita Nakamorです。久々の投稿です。

今日は、webカメラとOpenCVで動体検知してLine Notifyで画像を通知する 、ってことをやってみます。

予めアクセストークンをLine Notifyでとっておいて下さい。Bearer <ここにアクセストークンをはる> ってところに貼り付けます。<>は入りませんよ。

久々すぎるのでOpenCVの基礎からやっていきます。

ステップ1:静止画像ファイルを読み込んで出力する

 

ステップ2動画ファイルを読み込んで出力する→リアルタイムキャプチャーする

 

ステップ3 リアルタイムキャプチャー と リアルタイム背景差分処理

アクセストークンは、Line Notifyから取得して<>内にコピペしてください。かっこ部分は削除してください。

 

以上

OpenCV:異物検出プログラム

Jetaon Nanoで異物を検出したいのですが、まずは使い慣れたPCで作ってみます。

カメラ

エレコム WEBカメラ 200万画素 マイク内蔵 MAC対応 ブラック UCAM-C0220FBNBK

2015年に買った、2000円くらいの安物です。

レア過ぎて価格にプレミアがついていました。

インストール

参考にさせていただきました:https://www.kkaneko.jp/tools/win/cv2.html

Python3.7.7を入れました。最新の3.8.2はOpenCVが対応してない可能性があるのでやめておきました。

https://www.python.org/downloads/release/python-377/

Windows x86-64実行可能インストーラー

cmdでpythonとして、 3.7.7が起動させます。

pip listをすると

pip 19.2.3
setuptools 41.2.0
WARNING: You are using pip version 19.2.3, however version 20.0.2 is available.
You should consider upgrading via the ‘python -m pip install –upgrade pip’ command.

とバージョンアップを促されるので、

python -m pip install –upgrade pip

します。

numpyも入れてみましょう。

pip install numpy で1.18.2が入りました。

ではVScodeを起動させて、メニュー>view > select interpriter で python 3.7.7を選択し・・・たいところですが、ありません。

一旦VScodeを起動させ(まだpython 3.7.7は表示されない。)、そしてVScode下部のターミナルで一旦pythonを起動させます。3.7.7が起動しました。

スクリプト実行を何回かさせて、numpyがないよー、と言われながら、interpriterの指定を開くと,python 3.7.7が選択できるようになっていました。

で、スクリプトを実行すると、今度はcv2がないよー、といわれましたので、cmdから

で入れました。opencv-python-4.2.0.34が入りました。

cmdでエラーが出るときは、Power Shellを管理者権限で開いてやってみましょう。

で、確認です。

その他のライブラリをインストール

VScodeをいじっているとpylintをいれてと促されるので

$ -m pip install -U pylint –user

いろんなライブラリも同時に勝手にはいりました。

Package Version
—————– ——–
astroid 2.3.3
colorama 0.4.3
isort 4.3.21
lazy-object-proxy 1.4.3
mccabe 0.6.1
numpy 1.18.2
opencv-python 4.2.0.34
pip 20.0.2
pylint 2.4.4
setuptools 41.2.0
six 1.14.0
typed-ast 1.4.1
wrapt 1.11.2

エラー

こんなんがでます、frame.shepeがわからないそうです。
File “c:/Users/keita/scripts/shihenDetector/main.py”, line 39, in <module>
height, width, channels = frame.shape
AttributeError: ‘NoneType’ object has no attribute ‘shape’

 

frame.shepe[:3]にして、カメラ番号を1から0に変更したら内蔵カメラが映りました。

webカメラをUSBに指して、カメラ番号1に戻したらこれでも映りました。

ということで[:3]は関係なかったと思われます。

画像処理

OpenCVで

案1:BGR画像→グレースケール→検査窓トリミング→現在画像→二値化

案2:BGR画像→グレースケール→検査窓トリミング→初期画像と現在画像を差分を取る→二値化

 

の2案をやってみましたが、結果的に案1を採用します。

案1は、背景が動いたりカメラが動いたりしたときでも、検出精度は変わらない利点があります。

案2は、初期画像と現在画像を比較するので、背景になんらかの均一でない構造があったとしても、初期画像と現在画像で比較するので異物検出のロバスト性が高くなる利点があります。しかし、背景が動いたりカメラが動いたりして、初期画像とのズレが発生するとと検出できないか検出精度が大幅に落ちます。

今回は、よりシンプルな案1でやっていきます。

結果

スクリプトを回すと自動的に時系列データがcsvファイルとして入ってきます、

グラフ化

作成されたcsvファイル読み込んでグラフ化しました。

横軸が時間、縦軸は検出された異物(黒)の画素数です。

 

検出画像

開始5秒の画像は異物がない、まっさらな状態です。影一つありません。

開始15秒で5mm程度の異物を置いてみました。黒い点が現れます。

開始60秒で1mmと5mm程度の異物を置いてみました。どちらも黒い点になって現れます。200万画素の安物カメラでもこれだけの精度が用意に出ます。

周囲の照明コンディションが良ければ、0.5mm程度までは検出できそうです。

メインスクリプト

グラフ作成スクリプト

pandasとmatplotlibを使うのでインストールします。

pip install pandas

installed pandas-1.0.3 python-dateutil-2.8.1 pytz-2019.3

pip install matplotlib

installed cycler-0.10.0 kiwisolver-1.2.0 matplotlib-3.2.1 pyparsing-2.4.7

はい、ではスクリプト実行しましょう。

以上です。

shihenDetector

IOT:ラズベリーパイにVNC接続してOpenCVで顔認識する

どーもこんにちは(´・ω・`)です。

 

前回、ラズベリーパイにVNC接続してOpenCVでカメラの起動に成功しました。

今回は更に、そのOpenCVで顔認識も追加していこうと思います。

bcm2835-v4l2 の自動化

前回ハマりました、bcm2835-v4l2 についてですが、やはりシャットダウンすると、無効になってしまい、OpenCVが機能しませんでした。

今回は、まず起動したときに自動的にbcm2835-v4l2 が実行される方法からやっていきます。

/etc/modules を開くと

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with “#” are ignored.

i2c-dev

と書いてありますが、これは”ブートするときにロードするためのカーネルモジュール群” を書いておく場所になっています。Windowsでいうとスタートアップです。

ここにbcm2835-v4l2をいれればOKなのですが、このファイルは書き込み禁止なので、予め解除しておきます。

ファイル書き込み禁止を解除する

パーミッションを確認します。

pi@pi:/etc $ ls -l modules

-rw-r–r– 1 root root 203 3月 23 20:29 modules

スーパーユーザーsudoとしてチェンジモードchmodして、パーミッションを777にします。

pi@pi:/etc $ sudo chmod 777 modules

で、変更が成功したか確認すると
pi@pi:/etc $ ls -l modules

-rwxrwxrwx 1 root root 203 3月 23 20:29 modules

フルアクセスに変更されました。

その上で、チェンジディレクトリcd /etc/でvimでmodulesを開きます。

pi@pi:/etc $ vim modules

i2c-devの下にbcm2835-v4l2を追加して保存しましょう。

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with “#” are ignored.

i2c-dev
bcm2835-v4l2

キャットで確認すれば

pi@pi:/etc $ cat modules

しっかりとbcm2835-v4l2が追加されているのがわかると思います。

本題:Opencvで顔認識をやってみる

基本的には、前回のコードに学習済みハールカスケードと顔認識した顔に四角い図形でマーキングをするスクリプトを追加するだけです。

まずhaarcascade_frontalface_alt2.xmlは/usr/local/share/OpenCV/haarcascades/ の中に入っているので、作業ディレクトリであるhome/pi/の中へコピーを作っておきます。

以上、簡単ですね。

IOT:ラズベリーパイにVNC接続してOpenCVで cv2.VideoCapture(0)してみる

どーもこんにちはKeita_Nakamori(´・ω・`)です。

今日は、WindowsマシンからラズベリーパイにVNC接続してOpenCVで cv2.VideoCapture(0)に挑戦します。

まずはrealVNC viewerを起動してIPアドレスを打ってVNC接続します。

1回つなげたことのあるIPアドレスは保存され、アイコンみたいに表示されるので2回目からはアイコンをクリックするだけの簡単操作でした。

落とし穴

早速ハマりました。cap=cv2.VideoCapture(0)してもcapにはなにもデータが入ってきません。ふぁ~(*´Д`)

ret, img = cap.read() しても、当然imgはNoneです。

なぜだ!

思い出しました

そう、かつてハマりまくった、あのときを・・・

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

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

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

sudo modprobe bcm2835-v4l2

ということで、shellでsudo modprobe bcm2835-v4l2と打ってカメラを認識させます。

テストコードを実行すると・・・

はい、隣の部屋のソファーが写っています。

弱点

ラズパイはwifi接続、Windowsマシンは有線ですが、VNC解像度をミディアムにしても、カメラのキャプチャー映像はガックガク!!です。

低解像度だと色がキッタナイ!

どうにもなりません。

念の為、試運転のコードを貼っておきます。

 

 

OpenCV:python 画像追跡

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

動画中の物体を追跡する方法を勉強しました。メモを貼っておきます。

https://ensekitt.hatenablog.com/entry/2017/12/19/200000

OpenCVで画像処理

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

今日はOpenCVの使い方を学びました。ひたすらメモを残していきます!!

近日、この知識を元に、ラズパイカメラで寸法測定を行うということをやる予定です。

http://toyo-interest.com/rasbery-pi3-b%E3%81%A8opencv%E3%81%A7%e3%80%80%E3%81%99%E3%81%8D%E3%81%BE%E3%82%92%E6%B8%AC%E5%AE%9A%E3%81%97%E3%81%9F%E3%81%84-1/

以下、ひたすらメモ

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関連をインストールして行きましょう。

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

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

私は アップデート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を使って輪郭検出をやっていきましょう。