FLiR Dev Kit を試す その5
せっかくなので、ストリーミングしたい。
そこで、今までは Mjepg-streamer などを使ってきましたが、自分でゴリゴリいじるので、Python で実装しているサンプルを探したところ、有った!
Simple Python Motion Jpeg (mjpeg server) from webcam. Using: OpenCV,BaseHTTPServer · GitHub
まずは、USBカメラなどをさして、ストリームのチェックを行う。
おっけー
Lepton 向けに改変する
これは、 Mr Igor のスクリプトを書き換えています。
Simple Python Motion Jpeg (mjpeg server) from webcam. Using: OpenCV,BaseHTTPServer · GitHub
これね。
#!/usr/bin/python from pylepton import Lepton import cv2 import numpy as np from PIL import Image import threading from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer from SocketServer import ThreadingMixIn import StringIO import time class CamHandler(BaseHTTPRequestHandler): def do_GET(self): if self.path.endswith('.mjpg'): self.send_response(200) self.send_header('Content-type','multipart/x-mixed-replace; boundary=--jpgboundary') self.end_headers() try: with Lepton() as l: while True: data_buffer, rc = l.capture() if not rc: continue cv2.normalize(data_buffer, data_buffer, 0, 255, cv2.NORM_MINMAX) img = cv2.cvtColor(data_buffer, cv2.COLOR_GRAY2BGR) img[:, :, 0:2] = 0 img = cv2.resize(img, (320,240)) imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) jpg = Image.fromarray(np.uint8(np.asarray(imgRGB))) tmpFile = StringIO.StringIO() jpg.save(tmpFile,'JPEG') self.wfile.write("--jpgboundary") self.send_header('Content-type','image/jpeg') self.send_header('Content-length',str(tmpFile.len)) self.end_headers() jpg.save(self.wfile,'JPEG') time.sleep(0.2) except Exception as e: print('Exception', e.args); brak if self.path.endswith('.html'): self.send_response(200) self.send_header('Content-type','text/html') self.end_headers() self.wfile.write('<html><head></head><body>') self.wfile.write('<img src="http://127.0.0.1:8080/cam.mjpg"/>') self.wfile.write('</body></html>') return class ThreadedHTTPServer(ThreadingMixIn, HTTPServer): """Handle requests in a separate thread.""" def main(): global img try: server = ThreadedHTTPServer(('localhost', 8080), CamHandler) print "server started" server.serve_forever() except KeyboardInterrupt: server.socket.close() if __name__ == '__main__': main()
結果