初心者が画像認識を試した【500円ですぐできる】openCV入門

openCVだか知りませんが、とにかく使いましょう。道具は:

ラズパイZero:500円位のコンピュータ。
・その専用カメラ:700円位。(← USBカメラでもOK。)

この書籍を参考にしました。コンパクトでおススメ。

sudo apt-get install libopencv-dev python-opencv

と打ち、処理を待ちます。私はPCでサンプルプログラム(zip)をDL。
VNCでZeroにZipファイルを移し、右クリック、「指定先にファイルを展開」で、/home/pi/bluebacksと入力し、cd bluebacksで移動します。

python bb2-07-01-preview.py

でカメラが起動。qキーで終了です。凄く簡単です!!!

2値化

画像を白と黒で表現します。上記ファイルでコメントアウトし、大津の方法を選択します。

おおっ!できる!

エッジを検出

以下を実行。Cannyフィルタだそうです。

$ python bb2-07-03-cannyedge.py

なんて簡単なんだ!しかも楽しい。

円の検出

円は真円じゃないと無理だが、コレ。

$ python bb2-07-04-circle.py

マグカップの底を認識^^

ここまでは本のサンプルプログラムどおり、サクサクできました。
問題はここからです!できるかなぁ。。

色の検出

農業に使用したいので、色をやります。

OpenCVではHSV法が良いらしい。

H:色彩環上の色を固定
S:彩度
V:白黒の値(Value)

以下を参考:(赤色ならh<20かつH>200,彩度を127以上とする)

案の定w 上手くいかないので、以下にバージョンを確認した。

OpenCVのバージョンを確認

$ python と入力
>>> import cv2 と入力
>>> print cv2.__version__ と入力
2.4.9.1 私の場合、OpenCVは2.4でした。

3.2 もあるけど、互換性ではなく私のスキルに問題かw

無理矢理、できた;

以下を参考に、円の認識の演習のように書き直したらできた:

ツイッターの青を検出すると、こう白抜き。
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
赤の時計とフェラーリ308gt4LMを抽出。
lower_red = np.array([0,180,50])
upper_red = np.array([10,255,255])

ただし赤だけはHSV法で色彩環をまたぐ色なので、H=212~255も加えるのだが、どうも色換算が変だ。[160,100,50]-[255,255,255]が正解。

これでマジェンタ側を正確に補足できた。赤のHは160-255, 0-20位。

これで、例えばトマトやイチゴを認識

とりあえず初めてOpenCVを触ったけど、参考本があった所はスムーズにできた。これで収穫するとなると、ハード面を考えるべきだろうけど、今回はこの位で勘弁。プログラムは最後に載せた。

特定の色を検出する所までできたので、結構大きな進歩です。感謝。

また、色以外にもOpenCVは色々使えそうです。

数を数えるとかにも使える。

偶然見かけた、この辺の話が面白いですね。

<動いたプログラム>

# -*- coding: utf-8 -*-
import picamera
import picamera.array
import cv2
import numpy as np

with picamera.PiCamera() as camera:
with picamera.array.PiRGBArray(camera) as stream:
camera.resolution = (320, 240)

while True:
# stream.arrayにBGRの順で映像データを格納
camera.capture(stream, ‘bgr’, use_video_port=True)
# 映像データをグレースケール画像HSVに変換
hsv = cv2.cvtColor(stream.array, cv2.COLOR_BGR2HSV)

lower_red = np.array([0,180,50])
upper_red = np.array([10,255,255])

mask = cv2.inRange(hsv, lower_red, upper_red)
res = cv2.bitwise_and(stream.array,stream.array, mask= mask)

cv2.imshow(‘Normal’,stream.array)
cv2.imshow(‘mask’,mask)
cv2.imshow(‘red’,res)

# “q”を入力でアプリケーション終了
if cv2.waitKey(1) & 0xFF == ord(‘q’):
break
# streamをリセット
stream.seek(0)
stream.truncate()

cv2.destroyAllWindows()

なお、この本のサポートページにGUIで起動させる案内あり。

とても助かりますね!

QR Code