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

Python:一定の時間間隔でプログラムを実行する方法

一定の時間間隔でプログラムを実行する方法を考える必要がありましたので、考えたスクリプトをメモしておきます。

これを使えば、OpenCVを使っているときに、while文の中で動画を取得し処理している最中に、任意のインターバルで時刻や分析データをファイルに保存することができます。

スクリプト

出力結果

0.001sec つまり 0~1msec程度の遅れがあります。

私の用途では、十分許容できます。

 

以上