Untitled
unknown
plain_text
9 months ago
1.8 kB
5
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)
Editor is loading...
Leave a Comment