Inhoudsopgave:

Cat-a-way - Computer Vision Cat Sprinkler - Ajarnpa
Cat-a-way - Computer Vision Cat Sprinkler - Ajarnpa

Video: Cat-a-way - Computer Vision Cat Sprinkler - Ajarnpa

Video: Cat-a-way - Computer Vision Cat Sprinkler - Ajarnpa
Video: Next Level Cat Repellent - Funny Cat Reactions! 2024, November
Anonim
Cat-a-way - Computer Vision Cat Sprinkler
Cat-a-way - Computer Vision Cat Sprinkler

Probleem - Katten gebruiken je tuin als toilet

Oplossing - Besteed te veel tijd aan het ontwerpen van een kattensproeier met automatische YouTube-uploadfunctie

Dit is geen stap voor stap, maar een overzicht van de constructie en wat code

#BeforeYouCallPETA - Met de katten gaat het goed, het is een lagedruksproeier, net als regen, die ze kunnen ontlopen voordat hij zelfs maar naar hen toe draait. Het project is niet om een kat te laten weken, maar om ze weg te wijzen voordat ze mijn tuin bevuilen met de kattenversie van Barkers Eggs.

Stap 1: Belangrijkste vereiste items:

Belangrijkste vereiste items
Belangrijkste vereiste items

Raspberry Pi nul & SD-kaart

Raspberry Pi-camera

Relais

555-timer…. (of een Arduino en een ander relais als je 555-timers niet aankomen)

solenoïde

sproeier

Een soort behuizing voor de elektronica

De bereidheid om een metaforische spijker te slaan met een voorhamer van 6 ton

Een camera met zo weinig resolutie dat je nauwelijks het water kunt zien, maar de katten nog steeds kunt zien rennen voor dekking

Stap 2: Het systeem

Image
Image

1, Pi-camera detecteert een object ter grootte van een kat dat een paar cameraframes beweegt (uitgelegd in de volgende stap)

2, Pi zet sprinkler in werking

3, Kat zoekt dekking

4, Video automatisch geüpload naar YouTube voor kijkplezier!

Stap 3: Codeertijd

Samenvoegen
Samenvoegen

Door openCV te gebruiken met frame-subtractie, kun je delen van het frame vinden die in de loop van de tijd veranderen, met behulp van een aantal handige functies kun je erachter komen hoe groot deze veranderingen zijn en of ze in de loop van de tijd aanhouden, en vooral om erachter te komen of ze de grootte van een kat hebben.

Er zijn nogal wat tutorials over frame-subtractie die tot in detail gaan als je een snelle Google-zoekopdracht uitvoert.

Overzicht van hoe de code werkt

1, De camera blijft frames maken en ze vergelijken met de vorige

2, als een vorm ter grootte van een kat wordt gedetecteerd, wordt dit opgemerkt:

3, als de verandering in de grootte van de kat aanhoudt over ongeveer 4 frames, gebruikt de pi zijn GPIO om het relais van stroom te voorzien om arduino te starten

4, de Arduino stuurt een signaal om het tweede relais gedurende 5 seconden van stroom te voorzien, waardoor de solenoïde wordt geactiveerd

5, de solenoïde wanneer deze wordt ingeschakeld, laat water naar de sprinkler toe;

6, terwijl sprinkler actief is, stopt de camera met detecteren en neemt video op;

7, video is geüpload naar YouTube

8, Stills geüpload naar dropbox voor fijnafstemmingssysteem

Opmerking - Waarom ik uiteindelijk 2 relais en een arduino heb gebruikt om een solenoïde gedurende 5 seconden in te schakelen …

1, de pi kan de solenoïde niet starten en stoppen tijdens het opnemen van de video, aangezien de python-scripts pauzeren totdat de video is voltooid, vandaar de noodzaak voor de arduino (of 555-timer) om de solenoïde onafhankelijk van het script te openen en te sluiten terwijl de video wordt nog steeds opgenomen.

2, Het eerste relais en arduino kunnen worden vervangen door een 555-timer, maar die kwam niet op tijd in de post voor dit project, 555 zou veel tijd, geld en stappen besparen.

3, de pi kan de solenoïde niet rechtstreeks activeren, omdat de Pi GPIO werkt op 3.3v en 51mA max, en de solenoïde wil dat 5V en veel meer dan 51mA worden geactiveerd.

4, Elk frame kan worden bijgesneden om bewegingsdetectie in ongewenste gebieden, zoals een burentuin, te verwijderen. Als u dit niet doet, zal die buurman verwarde blikken in uw tuin geven omdat de sproeier elke keer afgaat als hij zijn schuurtje in wil.

5, heb ik waarschijnlijk iets voor de hand liggends gemist en heb ik mijn tijd verspild om het zo op te zetten.

Code hieronder:

import cv2import numpy als np import argparse #cat import tijd import RPi. GPIO als GPIO import os import dropbox van picamera.array import PiRGBArray vanuit picamera import PiCamera #------------------ ------------------------------ Uploaden naar youtube----------------- --------------------- def HDtoYoutube(): ctime = time.strftime("_%H-%M-%S") cdate = time.strftime ("_%d-%m-%Y") vidname = ctime + cdate #Trigger relay GPIO.output(11, True) time.sleep(.5) GPIO.output(11, False) print("Video nemen") probeer: #Take Video os.system('raspivid -w 1640 -h 922 -o vid{0}.h264 -t 15000'.format(vidname)) #Upload to youtube print("Uploading to YouTube") os. system('sudo youtube-upload --title="Cat Got Wet {0}" --client-secrets=client_secret.json vid{0}.h264'.format(vidname)) #Verwijder videobestand wanneer klaar os.remove ('vid{0}.h264'.format(vidname)) print("Video geüpload en verwijderd van Pi") behalve: pass #-------------------- ----------------------------Nog steeds naar dropbox------------------- -------------------- def St illsToDropbox(): print("Uploading Still To Dropbox Function") access_token = 'Ah ah ah, je zei het toverwoord niet…Ah ah ah, je zei het toverwoord niet' ctime = time.strftime(" %H:%M:%S") cdate = time.strftime("%d-%m-%Y") probeer: bestandsnaam = "/Motion/{0}/DetectedAt_{1}.jpg".format(cdate, ctime) print(bestandsnaam) client = dropbox.client. DropboxClient(access_token) image = open("ToDropbox.jpg", 'rb') client.put_file(bestandsnaam, afbeelding) image.close() os.remove("ToDropbox.jpg") behalve: pass #------------------------------------------ ------ Beweging detecteren----------------------------------------- def DetectMotion(): #Define vars min_area = 400 tolarance = 25 #change in pixel bluramount = 21 timetoforget = 0,5 kernel = np.ones((5, 5), np.uint8) #used for dialate MotionCounter = 0 MinTargetArea = 600 # kleinste formaat om te detecteren MaxTargetArea = 5000 #Grootste formaat om nu te detecteren = time.time() then = time.time() #initialize camera camera = PiCamera() camera.resolution = (640, 480) camera.framerate = 10 raw Capture = PiRGBArray(camera, size=(640, 480)) #warmup camera time.sleep(1) #Pak het eerste frame en bereid het voor om naar cv2.acumulate weight camera.capture(rawCapture, format="bgr") avg te gaan = rawCapture.array #Ongewenst gebied uitsnijden PolyCrop = np.array(

#HowToTriggerRealProgrammersWithBadCode

Stap 4: Samenvoegen

Samenvoegen
Samenvoegen
Samenvoegen
Samenvoegen
Samenvoegen
Samenvoegen

Stop de elektra in een waterdichte behuizing, schroef dingen in muren en gebruik veel ducttape en hete lijm

Stap 5: Resultaten

Image
Image
Resultaten
Resultaten

Als het werkt, werkt het

Stap 6: Valse positieven

Valse positieven
Valse positieven

Als dat niet het geval is, sproeit het kattenschaduw, je vrouw en je dochter.

Pro-tip - Zet een schakelaar bij de deur die het bewegingsdetectieprogramma pauzeert… vergeet hem dan te gebruiken en word doorweekt als je de vuilnisbakken buiten zet.

Ik hoop dat ik alle experts op het gebied van programmeren, elektronica en doe-het-zelf heb doen ineenkrimpen met alle fouten die ik waarschijnlijk heb gemaakt, en ik hoop vooral dat je genoten hebt van al mijn spelfouten.

Aanbevolen: