Created
September 29, 2019 20:50
-
-
Save jamesgregson/c3b3aec3c6b5d3d81a8c2049cbeea8a0 to your computer and use it in GitHub Desktop.
Python3 Stereo MJPG streaming with opencv
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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