@Epigraphe

Как разделить отображение видеопотоков после yolo в Джанго?

Есть скрипт, который обрабатывает изображения с камер, детектит объекты и аннотирует их.
Работает на yolo и supervision. Тестировал все это на стримлит, там работает. Теперь необходимо перенести на джанго - там работает не так(
Стримлит генерирует три отображения видеопотока, по одному для каждой камеры. В Джанго все три камеры отрабатывают в одно "отображение". Как сделать так, чтобы и в джанго тоже было три видеопотока на странице?
Грубо говоря, необходимо сделать "видеостену" в Джанго, на которой бы выводились потоки со всех камер.

Модель инициализируется вот так:
model = YOLO("yolov8n.pt")
results = model("list.streams", stream=True, classes=0, conf=0.9)

Как написано в документации - Return a generator with stream=True

Сам кусок во views.py в джанго:

def video_stream(request):
    def generate_frames():
        for i, result in enumerate(results):
            image = result.orig_img
            detection_results = model(image)[0]
            detections = sv.Detections.from_ultralytics(detection_results)
            detections = tracker.update_with_detections(detections)

            annotated_frame = process_frame(image, stream_index=i)  # Pass stream_index to process_frame
            resized_image = cv2.resize(annotated_frame, (1024, 768))

            _, frame = cv2.imencode('.jpg', resized_image)
            frame = frame.tobytes()

            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
    return StreamingHttpResponse(generate_frames(), content_type='multipart/x-mixed-replace; boundary=frame')


Вывожу на страницу так:
<div>
        <img src="{% url 'video_stream' %}" alt="Video Stream 1" width="1024" height="768">
    </div>


Кусок в Стримлит, который работает:
for i, result in enumerate(results):
    image = result.orig_img
    detection_results = model(image)[0]
    detections = sv.Detections.from_ultralytics(detection_results)
    detections = tracker.update_with_detections(detections)

    annotated_frame = process_frame(image)
    resized_image = cv2.resize(annotated_frame, (1024, 768))
    video_placeholders[i % 3].image(resized_image, channels="BGR", use_column_width=True, caption=f"Video {i + 1}")
  • Вопрос задан
  • 101 просмотр
Пригласить эксперта
Ответы на вопрос 1
Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting
Грубо говоря, необходимо сделать "видеостену" в Джанго, на которой бы выводились потоки со всех камер.

Как минимум, видеопоток нужно выводить по отдельности:
<div>
    <img src="{% url 'stream_1' %}" alt="Stream 1" width="1024" height="768"/>
    <img src="{% url 'stream_2' %}" alt="Stream 2" width="1024" height="768"/>
</div>

Затем нужно модифицировать функцию video_stream так, чтобы она обрабатывала отдельные видеопотоки.
Затем, необходимо модифицировать функцию с маршрутами urls.py, чтобы мы имели несколько маршрутов, например:
path('video/stream_1/', views.video_stream, {'camera_id': 0}, name='stream_1'),
path('video/stream_2/', views.video_stream, {'camera_id': 1}, name='stream_2'),
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы