Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Computer Vision sebagai Sensor Gerak untuk SmartThings

Menggunakan Raspberry Pi 3 dan PiCam, sensor bertenaga computer vision ini mendeteksi wajah dan mengirimkan data keberadaan melalui LAN – UPNP ke SmartThings.

Saya akan mulai dengan mengasumsikan bahwa Anda memiliki Raspberry Pi 3 dengan kamera yang berfungsi dan Open CV terinstal di dalamnya. Jika tidak, saya merekomendasikan tutorial ini 🙂

Membuat Device Handler  SmartThings Kustom

Di IDE SmartThings, kami membuat pengendali perangkat baru untuk sensor Computer Vision Motion kami.

Buka bagian “Penangan Perangkat Saya”, klik “+ Buat Pengendali Perangkat Baru” di pojok kanan atas.

Dalam hal ini kita akan membuatnya dari kode. Klik tab kedua “Dari Kode”, tempel kode terlampir “Device Handler” dan klik tombol “Buat”.

Di halaman berikutnya, klik “Publikasikan” agar perangkat tersedia untuk Anda.

Menulis Aplikasi SmartThings

Serupa dengan Device Handler, kita akan pergi ke bagian “My SmartApps”, klik “+ Create New SmartApps” di pojok kanan atas.

Kami juga akan membuatnya dari kode. Klik tab kedua “Dari Kode”, tempel kode terlampir “SmartApp” dan klik “Buat”.

Di halaman berikutnya, klik “Publikasikan”.

Menyiapkan Raspberry Pi 

Sekarang kita harus menambahkan skrip python yang akan mengambil gambar dari kamera, mendeteksi wajah dan melaporkan ke SmartThings.

 Pertama memiliki dan memasang imutils dan memutar

Jika Anda belum menginstal paket imutils, Anda dapat mengambilnya dari GitHub atau menginstalnya melalui:

pip install imutils 

Untuk memutar:

sudo apt-get install python-twisted-web 

Setelah semuanya siap, buka /home/pi dan buat direktori untuk menyimpan skrip

mkdir cameracd camera 

Buat file skrip:

sudo nano ssdpcamera.py 

Tempelkan kode terlampir  Skrip Python Kamera” dan simpan dengan menekan “control + x” lalu “y” dan enter.

Uji skrip dengan mengetik python ssdpcamera.py Anda akan melihat sesuatu seperti ini:

Menemukan dan Memasangkan Raspberry Pi

Dari aplikasi seluler SmartThings, kita harus pergi ke Marketplace di pojok kanan bawah, klik tab “SmartApps” dan akhirnya cari di “+ Aplikasi Saya” untuk “Computer Vision (Connect)”

Pastikan Raspberry Pi aktif dan skrip python berjalan.

SmartApp akan memulai proses penemuan dan setelah ditemukan, klik dialog pemilihan dan pilih perangkat dan klik “Selesai”.

Ini akan membuat perangkat di akun Anda dan mulai menerima pembaruan.

Mulai Otomatis

Terakhir jika Anda ingin menjalankan skrip python secara otomatis saat Anda menghidupkan Raspberry Pi, Anda dapat mengedit /etc/rc.local dan menambahkan baris berikut.

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

() membuat kedua perintah berjalan di latar belakang.

Kode

#!/usr/bin/python2.7""" Kamera Visi Komputer untuk SmartThingsCopyright 2016 Juan Pablo Risso <[email protected]>Ketergantungan:python-twisted, cv2, pyimagesearchLicensed di bawah Lisensi Apache, Versi 2.0 ("Lisensi"); Anda tidak boleh menggunakan file ini kecuali sesuai dengan Lisensi. Anda dapat memperoleh salinan Lisensi di:http://www.apache.org/licenses/LICENSE-2.0Kecuali diwajibkan oleh hukum yang berlaku atau disetujui secara tertulis, perangkat lunak yang didistribusikan di bawah Lisensi didistribusikan "SEBAGAIMANA ADANYA", TANPA JAMINAN ATAU KONDISI APA PUN, baik tersurat maupun tersirat Lihat Lisensi untuk bahasa tertentu yang mengatur izin dan batasan berdasarkan Lisensi. """impor argparseimpor loggingimport cv2import urllib2import imutilsdari waktu impor waktu dari picamera.array impor PiRGBArray dari picamera impor PiCamera dari twisted.web server impor, sumber daya dari twisted.internet impor reaktor dari bengkok.internet.tunda impor berhasil dari bengkok.inter net.protocol import DatagramProtocolfrom twisted.web.client import Agentfrom twisted.web.http_headers import Headerfrom twisted.web.iweb import IBodyProducerfrom twisted.web._newclient import ResponseFailedfrom zope.interface import implementsSSDP_PORT =1900SSDP_ADDR ='239.255.255.250'd1c58eb ='239.255.255.250'UUID -9220-11e4-96fa-123b93f75cba'SEARCH_RESPONSE ='HTTP/1.1 200 OK\r\nCACHE-CONTROL:max-age=30\r\nEXT:\r\nLOKASI:%s\r\nSERVER:Linux, UPnP/ 1.0, Pi_Garage/1.0\r\nST:%s\r\nUSN:uuid:%s::%s'# inisialisasi kamera dan ambil referensi ke kamera mentah# capturecamera =PiCamera()camera.resolusi =(640 , 480)camera.framerate =32rawCapture =PiRGBArray(camera, size=(640, 480))auxcount =0# buat pendeteksi wajah dan biarkan kamera memanas fd =FaceDetector("cascades/haarcascade_frontalface_default.xml")time.sleep (0,1)def define_ip_for_host(host):"""Tentukan alamat IP lokal yang digunakan untuk berkomunikasi dengan host tertentu"""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(objek):"""Menulis sebuah string dalam memori ke permintaan Twisted"""implements(IBodyProducer)def __init__(self, body):self.body =bodyself.length =len(body)def startProducing(self, consumer):# pylint:disable=invalid- name"""Mulai memproduksi string yang disediakan ke konsumen yang ditentukan"""consumer.write(self.body)return success(None)def pauseProducing(self):# pylint:disable=invalid-name"""Jeda produksi - tidak ada operasi """passdef stopProducing(self):# pylint:disable=invalid-name""" Berhenti memproduksi - tidak ada operasi"""passclass SSDPServer(DatagramProtocol):"""Menerima dan menanggapi permintaan penemuan M-SEARCH dari hub SmartThings" ""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('sebelum', 'shutdown', self.stop) # pylint:disable=no-memberdef datagramReceived(self, data, (host, port)):try:header, _ =data.split(b'\r\n\r\n')[:2]kecuali ValueError:returnlines =header.split ('\r\n')cmd =lines.pop(0).split(' ')lines =[x.replace(':', ':', 1) for x in lines]lines =[x for x dalam baris if len(x)> 0]headers =[x.split(':', 1) for x in lines]headers =dict([(x[0].lower(), x[1]) for x in headers])logging.debug('SSDP command %s %s - dari %s:%d dengan header %s', cmd[0], cmd[1], host, port, headers)search_target =''if ' st' di headers:search_target =headers['st']if cmd[0] =='M-SEARCH' dan cmd[1] =='*' dan search_target di self.device_target:logging.info('Menerima %s %s untuk %s dari %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 ESPON % (url, search_target, UUID, self.device_target)self.port.write(response, (host, port))else:logging.debug('Mengabaikan perintah SSDP %s %s', cmd[0], cmd[ 1])def stop(self):"""Keluar dari grup multicast dan berhenti mendengarkan"""self.port.leaveGroup(SSDP_ADDR, interface=self.interface)self.port.stopListening()class StatusServer(resource.Resource):"""Server HTTP yang melayani status kamera ke hubSmartThings"""isLeaf =Truedef __init__(self, device_target, subscription_list, garage_door_status):self.device_target =device_targetself.subscription_list =subscription_listself.garage_door_status =garage_door_statusresource.Resource_init_ self)def render_SUBSCRIBE(self, request):# pylint:disable=invalid-name"""Menangani permintaan berlangganan dari ST hub - hub ingin diberitahu tentang pembaruan status pintu garasi"""headers =request.getAllHeaders()logging.debug ("BERLANGGANAN:%s", headers)jika 'callback' di header:cb_url =headers['callback'][1:-1]jika bukan cb_url di self.subscription_list:self.subs cription_list[cb_url] ={}#reactor.stop()logging.info('Added subscription %s', cb_url)self.subscription_list[cb_url]['expiration'] =time() + 24 * 3600return ""def render_GET( self, request):# pylint:disable=invalid-name"""Menangani permintaan polling dari ST hub"""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("Permintaan polling dari %s untuk %s - dikembalikan %s",request.getClientIP(),request.path,cmd)return msgelse:logging.info( "Menerima permintaan palsu dari %s untuk %s",request.getClientIP(),request.path)return ""kelas MonitorCamera(objek):"""Memantau status kamera, menghasilkan pemberitahuan setiap kali statusnya berubah"""def __init__( diri, target_perangkat, daftar_langganan, status_kamera):# pylint:nonaktifkan=terlalu banyak-argumen sendiri.device_target =device_targetself.subscription_list =subscription_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)# ambil array NumPy mentah yang mewakili imageframe =rawCapture.array# ubah ukuran frame dan ubah menjadi grayscaleframe =imutils.resize(frame, lebar =640)gray =cv2.cvtColor (frame, cv2.COLOR_BGR2GRAY)# mendeteksi wajah pada gambar dan kemudian mengkloning frame# sehingga kita dapat menggambar di atasnyafaceRects =fd.detect(abu-abu, scaleFactor =1.1, minNeighbors =10,minSize =(30, 30))frameClone =frame.copy()if faceRects !=():auxcount =0 if current_state =='inactive':current_state ='active' logging.info('State diubah dari %s menjadi %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 ='inactive' logging.info('Status berubah dari %s menjadi %s', self.camera_status['last_state'], current_state)self.camera_status['last_state'] =current_stateself.notify_hubs() # loop over kotak pembatas wajah dan gambar untuk (fX, fY, fW, fH) di faceRects:cv2.rectangle(frameClone, (fX, fY), (fX + fW, fY + fH), (0, 255, 0), 2 )# tampilkan umpan video pada jendela GUI baru#cv2.imshow("Face", videorotate)rawCapture.truncate(0) # Jadwalkan checkreactor.callLater(0, self.check_garage_state, current_state, auxcount) # pylint:disable=no-memberdef notify_hubs(self):"""Beri tahu hub SmartThings yang berlangganan bahwa telah terjadi perubahan status"""if self.camera_status['last_state'] =='inactive':cmd ='status-inactive'else:cmd ='status-active'untuk berlangganan di self.subscription_list:if self.subscription_list[subscription]['expiration']> time():logging.info("Notifying hub %s", subscription)msg ='%suuid:%s::%s' % (cmd, UUID, self.device_target)body =StringProducer(msg)agent =Agen(reaktor)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"""Tangani hub SmartThings yang mengembalikan kode status ke POST. Ini sebenarnya tidak terduga - biasanya ditutup koneksi untuk POST/PUT tanpa memberikan kode respons."""if response.code ==202:logging.info("Pembaruan status diterima")else:logging.error("Kode respons tak terduga:%s", response.code )def handle_error(self, response):# pylint:disable=no-self-use"""Tangani kesalahan yang menghasilkan saat melakukan NOTIFY. Sepertinya tidak ada cara untuk menghindari ResponseFailed - SmartThings Hub tidak menghasilkan kode respons yang tepat untuk POST atau PUT, dan jikaNOTIFY digunakan, ia mengabaikan isi."""if isinstance(response.value, ResponseFailed):logging.debug("Respons gagal (diharapkan)")else:logging.error("Respons tak terduga:%s", respon)def main():"""Fungsi utama untuk menangani penggunaan dari baris perintah"""arg_proc =argparse .ArgumentParser(description='Menyediakan status kamera aktif/tidak aktif ke hub SmartThings')arg_proc.add_argument('--httpport', dest='http_port', help='HTTP port number', 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=' Jumlah detik antara status kamera polling', default=5, type=int)arg_proc.add_argument('--debug', dest='debug', help='Aktifkan pesan debug', 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')# server SSDP untuk menangani discoverySSDPServer(status_port=options.http_port, device_target =device_target)# Situs HTTP untuk menangani subscriptions/pollingstatus_site =server.Site(StatusServer(device_target, subscription_list, camera_status))reactor.listenTCP(options.http_port, status_site) # pylint:disable=no-memberlogging.info('Inisialisasi selesai' )# Pantau status kamera dan kirim pemberitahuan tentang status changeMonitorCamera(device_target=device_target,subscription_list=subscription_list,camera_status=camera_status) reactor.run() # pylint:disable=no-memberif __name__ =="__main__":main()Sumber:Komputer Visi sebagai Sensor Gerak untuk SmartThings

Proses manufaktur

  1. ST:sensor gerak dengan pembelajaran mesin untuk pelacakan aktivitas dengan akurasi tinggi dan ramah baterai
  2. Sensor gerak, alarm, perekaman video dalam HA pada Raspberry Pi
  3. Sistem Sensor Gerak Inframerah DIY untuk Raspberry Pi
  4. Sensor Gerak menggunakan Raspberry Pi
  5. Penghitung Geiger – Tutorial Papan Sensor Radiasi untuk Raspberry Pi
  6. Raspberry Pi GPIO dengan sensor gerak PIR:Tutorial terbaik
  7. Membangun Jaringan Sensor untuk Gristmill Abad ke-18
  8. Menghubungkan Sensor Gerak PIR HC-SR501 dengan Raspberry Pi
  9. Membuat robot Raspberry Pi:Tutorial Terbaik untuk pemula
  10. 7 aplikasi visi komputer