Skip to content

Instantly share code, notes, and snippets.

@jamesgregson
Created September 29, 2019 20:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jamesgregson/c3b3aec3c6b5d3d81a8c2049cbeea8a0 to your computer and use it in GitHub Desktop.
Save jamesgregson/c3b3aec3c6b5d3d81a8c2049cbeea8a0 to your computer and use it in GitHub Desktop.
Python3 Stereo MJPG streaming with opencv
import cv2
import numpy as np
from http.server import BaseHTTPRequestHandler,HTTPServer
import io
import socket
import time
capture0 = None
capture1 = None
def get_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ip = s.getsockname()[0]
s.close()
return ip
class CamHandler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path.endswith('.mjpg'):
self.send_response(200)
self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0')
self.send_header('Connection', 'close')
self.send_header('Content-type','multipart/x-mixed-replace; boundary=--jpgboundary')
self.end_headers()
while True:
try:
rc = capture0.grab()
rc = capture1.grab()
rc,imgA = capture0.retrieve()
rc,imgB = capture1.retrieve()
if imgA is None or imgB is None:
continue
imgRGB = np.column_stack((imgA,imgB))
_,data = cv2.imencode('.jpg',imgRGB)
data = data.tobytes()
self.wfile.write(bytes('--jpgboundary','utf-8'))
self.send_header('Content-type','image/jpeg')
self.send_header('Content-length',str(len(data)))
self.end_headers()
self.wfile.write( data )
except (KeyboardInterrupt, BrokenPipeError):
break
return
if self.path.endswith('.html'):
self.send_response(200)
self.send_header('Content-type','text/html')
self.end_headers()
self.wfile.write(bytes('<html><head></head><body>Hello','utf-8'))
self.wfile.write(bytes('<img src="http://{}:8000/cam.mjpg"/>'.format(get_ip()),'utf-8'))
self.wfile.write(bytes('</body></html>','utf-8'))
return
def main():
global capture0
global capture1
fps = 60
width = 800
height = 600
capture1 = cv2.VideoCapture(2)
capture1.set(cv2.CAP_PROP_FPS, fps)
capture1.set(cv2.CAP_PROP_FRAME_WIDTH, width)
capture1.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
capture1.set(cv2.CAP_PROP_SATURATION, 0.2)
capture1.set(cv2.CAP_PROP_AUTOFOCUS, 0)
capture1.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'MJPG'))
capture0 = cv2.VideoCapture(0)
capture0.set(cv2.CAP_PROP_FPS, fps)
capture0.set(cv2.CAP_PROP_FRAME_WIDTH, width)
capture0.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
capture0.set(cv2.CAP_PROP_SATURATION, 0.2)
capture0.set(cv2.CAP_PROP_AUTOFOCUS, 0)
capture0.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'MJPG'))
global img
try:
server = HTTPServer(('',8000),CamHandler)
print("server started")
server.serve_forever()
except KeyboardInterrupt:
capture0.release()
capture1.release()
server.socket.close()
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment