Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Computervisie als bewegingssensor voor SmartThings

Met behulp van een Raspberry Pi 3 en een PiCam detecteert deze computer vision-aangedreven sensor gezichten en verzendt aanwezigheidsgegevens via LAN - UPNP naar SmartThings.

Ik zal beginnen met aan te nemen dat je een Raspberry Pi 3 hebt met een werkende camera en Open CV erop geïnstalleerd. Als je dat niet doet, raad ik deze zelfstudie aan 

Een aangepaste SmartThings-apparaathandler maken

In de SmartThings IDE maken we een nieuwe apparaathandler voor onze Computer Vision-bewegingssensor.

Ga naar het gedeelte 'Mijn apparaathandler' en klik op '+ Nieuwe apparaathandler maken' in de rechterbovenhoek.

In dit geval zullen we het van code maken. Klik op het tweede tabblad 'Van code', plak de bijgevoegde code 'Device Handler' en klik op "Maken".

Klik op de volgende pagina op "Publiceren" om het apparaat voor u beschikbaar te maken.

De SmartThings-app schrijven

Net als bij de apparaathandler gaan we naar het gedeelte 'Mijn SmartApps' en klikken op '+ Nieuwe SmartApps maken' in de rechterbovenhoek.

We zullen het ook van code maken. Klik op het tweede tabblad "Van code", plak de bijgevoegde code "SmartApp" en klik op "Maken".

Klik op de volgende pagina op "Publiceren".

De Raspberry Pi klaar maken 

Nu moeten we het python-script toevoegen dat afbeeldingen van de camera krijgt, gezichten detecteert en rapporteert aan SmartThings.

Eerste d ownload en installeer imutils en twisted

Als je het imutils-pakket nog niet hebt geïnstalleerd, kun je dat van GitHub halen of het installeren via:

pip install imutils 

Voor gedraaid:

sudo apt-get install python-twisted-web 

Nu alles klaar is, ga je naar /home/pi en maak een map aan om het script op te slaan

mkdir cameracd-camera 

Maak het scriptbestand:

sudo nano ssdpcamera.py 

Plak de bijgevoegde code  Camera Python-script” en sla op door op "control + x" en vervolgens op "y" te drukken en voer in.

Test het script door python ssdpcamera.py te typen, je zou zoiets als dit moeten zien:

De Raspberry Pi ontdekken en koppelen

Vanuit de mobiele SmartThings-app gaan we naar Marketplace in de rechterbenedenhoek, klik op het tabblad 'SmartApps' en zoek ten slotte in '+ Mijn apps' naar 'Computer Vision (Connect)'

Zorg ervoor dat de Raspberry Pi is ingeschakeld en dat het python-script actief is.

De SmartApp start het detectieproces en zodra deze is gevonden, klikt u op het selectievenster en selecteert u het apparaat en klikt u op "Gereed".

Hiermee wordt het apparaat in uw account gemaakt en wordt het ontvangen van updates.

Automatisch starten

Als u ten slotte het python-script automatisch wilt laten lopen wanneer u de Raspberry Pi inschakelt, kunt u /etc/rc.local bewerken en de volgende regel toevoegen.

(sleep 10;python /home/pi/camera/ssdpcamera.py)& 

De () zorgt ervoor dat beide commando's op de achtergrond worden uitgevoerd.

Code

#!/usr/bin/python2.7""" Computer Vision Camera voor SmartThingsCopyright 2016 Juan Pablo Risso <[email protected]>Afhankelijkheden:python-twisted, cv2, pyimagesearchLicensed under de Apache-licentie, versie 2.0 (de "Licentie"); u mag dit bestand alleen gebruiken in overeenstemming met de licentie. U kunt een kopie van de licentie verkrijgen op:http://www.apache.org/licenses/LICENSE-2.0 Tenzij vereist door de toepasselijke wetgeving of schriftelijk overeengekomen, wordt software die onder de Licentie wordt gedistribueerd, gedistribueerd op een "AS IS"-BASIS, ZONDER ENIGE GARANTIE OF VOORWAARDEN, expliciet of impliciet. Zie de Licentie voor de specifieke taal die de toestemmingen en beperkingen onder de Licentie regelt. """import argparseimport loggingimport cv2import urllib2import imutilsfrom time import timefrom picamera.array import PiRGBArrayfrom picamera import PiCamerafrom twisted.web import server, resourcefrom twisted.internet import reactorfrom twisted.internet.defer import succesfrom twisted.inter net.protocol import DatagramProtocolvan twisted.web.client import Agentfrom twisted.web.http_headers import Headersfrom twisted.web.iweb import IBodyProducerfrom twisted.web._newclient import ResponseMisluktvan zope.interface import implementsSSDP_PORT =1900SSDP_ADDR ='239.255.255.250'UUID ='d1c -9220-11e4-96fa-123b93f75cba'SEARCH_RESPONSE ='HTTP/1.1 200 OK\r\nCACHE-CONTROL:max-age=30\r\nEXT:\r\nLOCATION:%s\r\nSERVER:Linux, UPnP/ 1.0, Pi_Garage/1.0\r\nST:%s\r\nUSN:uuid:%s::%s'# initialiseer de camera en pak een verwijzing naar de onbewerkte camera# capturecamera =PiCamera()camera.resolution =(640 , 480)camera.framerate =32rawCapture =PiRGBArray(camera, size=(640, 480))auxcount =0# bouw de gezichtsdetector en laat de camera opwarmenfd =FaceDetector("cascades/haarcascade_frontalface_default.xml")time.sleep (0.1)def determine_ip_for_host(host):"""Bepaal het lokale IP-adres dat wordt gebruikt om met een bepaalde host te communiceren"""test_sock =DatagramProtocol()test_sock_listener =reactor.lis tenUDP(0, test_sock) # pylint:disable=no-membertest_sock.transport.connect(host, 1900)my_ip =test_sock.transport.getHost().hosttest_sock_listener.stopListening()return my_ipclass StringProducer(object):"""Schrijft een in-memory string naar een Twisted request"""implements(IBodyProducer)def __init__(self, body):self.body =bodyself.length =len(body)def startProducing(self, consumer):# pylint:disable=invalid- name"""Begin met het produceren van de geleverde string aan de gespecificeerde consument"""consumer.write(self.body)return slagen(None)def pauseProducing(self):# pylint:disable=invalid-name"""Pauzeer met produceren - geen op """passdef stopProducing(self):# pylint:disable=invalid-name""" Stop met produceren - geen op"""passclass SSDPServer(DatagramProtocol):"""Ontvangen en reageren op M-SEARCH-detectieverzoeken van SmartThings-hub" ""def __init__(self, interface='', status_port=0, device_target=''):self.interface =interfaceself.device_target =device_targetself.status_port =status_portself.port =reactor.listenMulticas t(SSDP_PORT, self, listenMultiple=True) # pylint:disable=no-memberself.port.joinGroup(SSDP_ADDR, interface=interface)reactor.addSystemEventTrigger('before', 'shutdown', self.stop) # pylint:disable=no-memberdef datagramReceived(self, data, (host, port)):try:header, _ =data.split(b'\r\n\r\n')[:2]behalve ValueError:returnlines =header.split ('\r\n')cmd =lines.pop(0).split(' ')lines =[x.replace(':', ':', 1) voor x in regels]lines =[x voor x in regels if len(x)> 0]headers =[x.split(':', 1) for x in lines]headers =dict([(x[0].lower(), x[1]) voor x in headers])logging.debug('SSDP-opdracht %s %s - van %s:%d met headers %s', cmd[0], cmd[1], host, poort, headers)search_target =''if ' st' in headers:search_target =headers['st']if cmd[0] =='M-SEARCH' en cmd[1] =='*' en search_target in self.device_target:logging.info('Ontvangen %s %s voor %s van %s:%d', cmd[0], cmd[1], search_target, host, port)url ='http://%s:%d/status' % (determine_ip_for_host(host) , self.status_port)respons =SEARCH_R ESPONSE % (url, search_target, UUID, self.device_target)self.port.write(response, (host, poort))else:logging.debug('Genegeerd SSDP-commando %s %s', cmd[0], cmd[ 1])def stop(self):"""Verlaat multicast-groep en stop met luisteren"""self.port.leaveGroup(SSDP_ADDR, interface=self.interface)self.port.stopListening()class StatusServer(resource.Resource):"""HTTP-server die de status van de camera naar de SmartThings-hub stuurt"""isLeaf =Truedef __init__(self, device_target, abonnementslijst, garage_door_status):self.device_target =device_targetself.subscription_list =abonnement_listself.garage_door_status =garage_door_statusresource.Resource.__init__( self)def render_SUBSCRIBE(self, request):# pylint:disable=invalid-name"""Abonneerverzoeken van ST-hub afhandelen - hub wil op de hoogte worden gehouden van statusupdates van garagedeuren"""headers =request.getAllHeaders()logging.debug ("ABONNEER:%s", headers)if 'callback' in headers:cb_url =headers['callback'][1:-1]indien niet cb_url in self.subscription_list:self.subs cription_list[cb_url] ={}#reactor.stop()logging.info('Abonnement %s toegevoegd', cb_url)self.subscription_list[cb_url]['expiration'] =time() + 24 * 3600return ""def render_GET( self, request):# pylint:disable=invalid-name"""Pollingverzoeken van ST-hub afhandelen"""if request.path =='/status':if self.garage_door_status['last_state'] =='inactive' :cmd ='status-inactive'else:cmd ='status-active'msg ='%suuid:%s::%s' % (cmd, UUID, self.device_target)logging.info("Pollingverzoek van %s voor %s - geretourneerde %s",request.getClientIP(),request.path,cmd)return msgelse:logging.info( "Ontvangen nepverzoek van %s voor %s",request.getClientIP(),request.path)return ""class MonitorCamera(object):"""Bewaakt de camerastatus en genereert meldingen wanneer de status verandert"""def __init__( self, device_target, abonnementslijst, camera_status):# pylint:disable=too-many-argumentsself.device_target =device_targetself.subscription_list =abonnement_listself.camera_stat us =camera_statuscurrent_state ='inactive'reactor.callLater(0, self.check_garage_state, current_state, auxcount) # pylint:disable=no-memberdef check_garage_state(self, current_state, auxcount):self.current_state =current_stateself.auxcount =auxcountcamera.capture( rawCapture, format="bgr", use_video_port=True)# pak de onbewerkte NumPy-array die het imageframe vertegenwoordigt =rawCapture.array# verander het formaat van het frame en converteer het naar grayscaleframe =imutils.resize(frame, width =640)gray =cv2.cvtColor (frame, cv2.COLOR_BGR2GRAY)# detecteer gezichten in de afbeelding en kloon vervolgens het frame# zodat we erop kunnen tekenenfaceRects =fd.detect(gray, scaleFactor =1.1, minNeighbours =10,minSize =(30, 30))frameClone =frame.copy()if faceRects !=():auxcount =0 if current_state =='inactive':current_state ='active' logging.info('Status gewijzigd van %s in %s', self.camera_status['last_state '], current_state)self.camera_status['last_state'] =current_stateself.notify_hubs()else:auxcount =auxcount + 1if auxcount ==60:current_state ='inactief' logging.info('Status gewijzigd van %s in %s', self.camera_status['last_state'], current_state)self.camera_status['last_state'] =current_stateself.notify_hubs() # loop over de gezichtskaders en teken ze voor (fX, fY, fW, fH) in faceRects:cv2.rectangle(frameClone, (fX, fY), (fX + fW, fY + fH), (0, 255, 0), 2 )# toon de videofeed in een nieuw GUI-venster#cv2.imshow("Face", videorotate)rawCapture.truncate(0) # Plan volgende checkreactor.callLater(0, self.check_garage_state, current_state, auxcount) # pylint:disable=no-memberdef notification_hubs(self):"""Informeer de geabonneerde SmartThings-hubs dat er een statuswijziging heeft plaatsgevonden"""if self.camera_status['last_state'] =='inactive':cmd ='status-inactive'else:cmd ='status-active'voor abonnement in self.subscription_list:if self.subscription_list[subscription]['expiration']> time():logging.info("Notifying hub %s", abonnement)msg ='%suuid:%s::%s' % (cmd, UUID, self.device_target)body =StringProducer(msg)agent =Agent(reactor)req =agent.request('POST',subscription,Headers({'CONTENT-LENGTH':[len(msg)]}),body)req.addCallback(self.handle_response )req.addErrback(self.handle_error)def handle_response(self, response):# pylint:disable=no-self-use"""Behandel de SmartThings-hub en retourneer een statuscode naar de POST. Dit is eigenlijk onverwacht - het wordt meestal gesloten de verbinding voor POST/PUT zonder een responscode te geven."""if response.code ==202:logging.info("Statusupdate geaccepteerd")else:logging.error("Onverwachte responscode:%s", response.code )def handle_error(self, response):# pylint:disable=no-self-use"""Behandel fouten bij het uitvoeren van de NOTIFY. Er lijkt geen manier te zijn om ResponseFailed te vermijden - de SmartThings Hub genereert geen juiste responscode voor POST of PUT, en als NOTIFY wordt gebruikt, negeert het de body."""if isinstance(response.value, ResponseFailed):logging.debug("Reactie mislukt (verwacht)")else:logging.error("Onverwachte reactie:%s", response)def main():"""Hoofdfunctie om gebruik vanaf de opdrachtregel af te handelen"""arg_proc =argparse .ArgumentParser(description='Geeft camera actieve/inactieve status aan een SmartThings-hub')arg_proc.add_argument('--httpport', dest='http_port', help='HTTP-poortnummer', default=8080, type=int) arg_proc.add_argument('--deviceindex', dest='device_index', help='Device index', default=1, type=int)arg_proc.add_argument('--pollingfreq', dest='polling_freq', help=' Aantal seconden tussen status pollingcamera', default=5, type=int)arg_proc.add_argument('--debug', dest='debug', help='Enable debug messages', default=False, action='store_true' )options =arg_proc.parse_args()device_target ='urn:schema s-upnp-org:device:RPi_Computer_Vision:%d' % (options.device_index)log_level =logging.INFOif options.debug:log_level =logging.DEBUGlogging.basicConfig(format='%(asctime)-15s %(levelname)- 8s %(message)s', level=log_level)subscription_list ={}camera_status ={'last_state':'unknown'}logging.info('Initializing camera')# SSDP-server voor het afhandelen van discoverySSDPServer(status_port=options.http_port, device_target =device_target)# HTTP-site voor het afhandelen van abonnementen/pollingstatus_site =server.Site(StatusServer(device_target, subscription_list, camera_status))reactor.listenTCP(options.http_port, status_site) # pylint:disable=no-memberlogging.info('Initialisatie voltooid' )# Camerastatus bewaken en meldingen verzenden over status changeMonitorCamera(device_target=device_target,subscription_list=subscription_list,camera_status=camera_status) reactor.run() # pylint:disable=no-memberif __name__ =="__main__":main()Bron:Computer Visie als bewegingssensor voor SmartThings

Productieproces

  1. ST:bewegingssensor met machine learning voor zeer nauwkeurige, batterijvriendelijke activiteitentracking
  2. Bewegingssensor, alarm, video-opname in HA op Raspberry Pi
  3. DIY infrarood bewegingssensorsysteem voor Raspberry Pi
  4. Bewegingssensor met Raspberry Pi
  5. Geigerteller – zelfstudie stralingssensorkaart voor Raspberry Pi
  6. Raspberry Pi GPIO met PIR-bewegingssensor:beste tutorial
  7. Een sensornetwerk bouwen voor een 18e-eeuwse korenmolen
  8. Interfacing HC-SR501 PIR-bewegingssensor met Raspberry Pi
  9. Bouw Raspberry Pi-robots:de beste tutorial voor beginners
  10. 7 toepassingen van computervisie
  11. Computer visie