Untitled

 avatar
unknown
plain_text
16 days ago
1.8 kB
3
Indexable
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