Untitled
from flask import Flask, Response, render_template_string from picamera2 import Picamera2 import cv2 import threading app = Flask(__name__) picam1 = Picamera2(camera_num=0) picam2 = Picamera2(camera_num=1) picam1.configure(picam1.create_video_configuration(main={"size": (1280, 720)})) picam2.configure(picam2.create_video_configuration(main={"size": (1280, 720)})) lock1, lock2 = threading.Lock(), threading.Lock() def generate_frames(picam, lock): with lock: picam.start() try: while True: _, buffer = cv2.imencode('.jpg', picam.capture_array()) yield (b'--frame\r\nContent-Type: image/jpeg\r\n\r\n' + buffer.tobytes() + b'\r\n') finally: picam.stop() @app.route('/') def index(): return render_template_string(""" <!DOCTYPE html> <html> <head> <title>Dual Camera Stream</title> <style> body { font-family: Arial, sans-serif; text-align: center; } .camera { display: inline-block; margin: 10px; } img { border: 1px solid black; width: 640px; height: 360px; } </style> </head> <body> <h1>Dual Camera Stream</h1> <div class="camera"><h2>Camera 1</h2><img src="/video_feed/1"></div> <div class="camera"><h2>Camera 2</h2><img src="/video_feed/2"></div> </body> </html> """) @app.route('/video_feed/<int:camera_id>') def video_feed(camera_id): return Response(generate_frames(picam1 if camera_id == 1 else picam2, lock1 if camera_id == 1 else lock2), mimetype='multipart/x-mixed-replace; boundary=frame') if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
Leave a Comment