忍者ブログ

設備のマニアどっとこむ

IoT開発、設備・DIYのブログ!

ラズパイで庭の野良猫退治

最近家の庭の野良猫がひどい。 ベビーカーに放尿するわ、コケ庭は荒らすわで困っていた。
以前の記事「庭に来る猫対策」で、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という画像を保存することができます。


これで猫がきたら・・・。



チョロチョロチョロ・・・。







拍手[1回]

PR

コメント

翻訳(Translate)

プロフィール

HN:
佐々木 雅史
性別:
男性
自己紹介:
2021年 ラズパイ、M5stackを用いたIoT開発を専門で受注するアルティメンテを設立。代表を務める。
・2020年ラズパイコンテスト優良賞受賞
・設備系資格多数(電験3種、消防設備士甲4、2級ボイラー技士、危険物乙4、電工2種、技術士補(電気・電子)、エネ電、フォークリフトなど)

AD

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30