最近家の庭の野良猫がひどい。 ベビーカーに放尿するわ、コケ庭は荒らすわで困っていた。
以前の記事「庭に来る猫対策」で、OpenCVで猫の顔を特定するというのをやったんだけど、猫の顔をカメラで認識するだけで特にその後はアクションしていなかった。
今回はもう一歩すすんで猫対策をしてみようと思う。猫を認識したら水をかけてみることにした。
そもそも猫に水なんてかけていいのかな? 虐待にならないか心配なので区のホームページを見てみた。
http://www.city.ota.tokyo.jp/seikatsu/hoken/pet_dog_cat/aigo/hun.html虐待にならない範囲であれば水はかけてもいいらしい。
ラズパイでは5Vか3.3Vしか使えないのでUSB出力からポンプで水を出すことにした。
ラズパイでUSBをON、OFするのには以下のコマンドでできる。
sudo hub-ctrl -b 1 -d 2 -P 2 -p 0
最後のpのあとの数字を0にするとOFF、1にするとONになる。
sudo hub-ctrl -b 1 -d 2 -P 2 -p 1
あとでpythonで使用するためとりあえずシェルスクリプトにしておきます。
usbon.shがON
usb.shがOFF
これを呼び出してUSBをON、OFFしていきます。 ここで気を付けなければいけないのですが、OpenCVでUSBカメラを使用すれば当然USBをOFFしたときにフリーズしてしまうのです。
(個別にUSBポートをOFFするのは断念してしまった・・。)
そこで今回、夜間使用することもあってか赤外線カメラを使用することにした。
USBではなく、ラズパイカメラ用のケーブルを使うのでUSBを気にせず使えます。
ラズパイとモバイルバッテリーをくっつけるとこんな感じです。
ラズパイカメラを使うにはpicameraのインストールが必要です。
pip install picamera
↓夜の庭でも画像はばっちり。
続いてコードです。
猫の学習モデルは
こちらの記事を参考にしてください。
この行でフルパス指定してください → '/home/pi/opencv-3.1.0/data/haarcascades/cascade.xml'
import numpy as np
import sys
from picamera.array import PiRGBArray
from picamera import PiCamera
import cv2
import time
import os
FRAME_W = 800
FRAME_H = 800
os.system('sudo sh usb.sh')
cascPath = '/home/pi/opencv-3.1.0/data/haarcascades/cascade.xml'
faceCascade = cv2.CascadeClassifier(cascPath)
camera = PiCamera()
camera.resolution = (FRAME_W, FRAME_H)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(FRAME_W, FRAME_H))
time.sleep(0.1)
for image in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
frame = image.array
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.equalizeHist( gray )
faces = faceCascade.detectMultiScale(gray, 1.1, 3, 0, (10, 10))
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
os.system('sudo sh usbon.sh')
time.sleep(3)
os.system('sudo sh usb.sh')
cv2.imwrite('cat2.jpg', frame)
frame = cv2.resize(frame, (800,800))
cv2.imshow('Video', frame)
key = cv2.waitKey(1) & 0xFF
rawCapture.truncate(0)
if key == ord("q"):
break
cv2.destroyAllWindows()
猫のフレームを検知した場合、あらかじめ作ったシェルスクリプトでポンプをON、OFFしています。 ついでにcv2.imwrite('cat.jpg', frame)でcat.jpgという画像を保存することができます。
これで猫がきたら・・・。
チョロチョロチョロ・・・。