Как уменьшить задержку захвата видео с веб-камеры с помощью OpenCV в скрипте Python YOLOv8?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как уменьшить задержку захвата видео с веб-камеры с помощью OpenCV в скрипте Python YOLOv8?

Сообщение Anonymous »

Я использую OpenCV на Python для записи видео с веб-камеры и обработки его с помощью модели YOLOv8 для распознавания транспортных средств. Видеопоток разделен на четыре квадранта, которые анализируются отдельно для подсчета автомобилей. В зависимости от количества транспортных средств я проектирую светофоры с помощью графической библиотеки черепахи.
Однако у меня возникают серьезные задержки при захвате и отображении видео, что приводит к прерывистые и медленные кадры. Вот соответствующая часть моего кода:
Код, над которым я работаю, представлен ниже:

Код: Выделить всё

import cv2
import argparse
import numpy as np
from ultralytics import YOLO
import supervision as sv
import turtle

def parse_arguments() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="YOLOv8 live")
parser.add_argument("--webcam-resolution", default=[1280, 720], nargs=2, type=int)
return parser.parse_args()

def draw_signal(x, y, color):
turtle.penup()
turtle.goto(x, y)
turtle.pendown()
turtle.begin_fill()
turtle.color(color)
turtle.circle(30)
turtle.end_fill()

def main():
args = parse_arguments()
frame_width, frame_height = args.webcam_resolution
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, frame_width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height)

model = YOLO("yolov8l.pt")
box_annotator = sv.BoxAnnotator(thickness=2, text_thickness=2, text_scale=1)
turtle.speed(0)
turtle.hideturtle()
turtle.title("Traffic Signal")

while True:
ret, frame = cap.read()
height, width, _ = frame.shape
half_height, half_width = height // 2, width // 2
quadrants = [frame[:half_height, :half_width], frame[:half_height, half_width:], frame[half_height:, :half_width], frame[half_height:, half_width:]]
max_vehicle_count = 0
max_vehicle_quadrant = -1

for i, quadrant in enumerate(quadrants):
result = model(quadrant, agnostic_nms=True)[0]
detections = sv.Detections.from_yolov8(result)
detections = detections[(detections.class_id == 2) | (detections.class_id == 3)]
vehicle_count = len(detections)

if vehicle_count > max_vehicle_count:
max_vehicle_count = vehicle_count
max_vehicle_quadrant = i

labels = [f"Vehicle {j+1}: {model.model.names[class_id]} {confidence:0.2f}" for j, (bbox, confidence, class_id, _) in enumerate(detections)]
quadrant = box_annotator.annotate(scene=quadrant, detections=detections, labels=labels)
cv2.rectangle(quadrant, (0, 0), (quadrant.shape[1], quadrant.shape[0]), (255, 255, 255), 2)
cv2.putText(quadrant, f"Vehicles: {len(detections)}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

if i == 0:
frame[:half_height, :half_width] = quadrant
elif i == 1:
frame[:half_height, half_width:] = quadrant
elif i == 2:
frame[half_height:, :half_width] = quadrant
elif i == 3:
frame[half_height:, half_width:] = quadrant

turtle.clear()
signal_colors = ["red"] * 4
if max_vehicle_quadrant != -1:
signal_colors[max_vehicle_quadrant] = "green"

for i, color in enumerate(signal_colors):
draw_signal(-frame_width//2 + 100 + i * 150, frame_height//2 - 100, color)

cv2.imshow("yolov8", frame)
if cv2.waitKey(30) == 27:
break

cap.release()
cv2.destroyAllWindows()

if __name__ == "__main__":
main()
Что я пробовал:
  • Регулировка разрешения кадра: Я пробовал различные разрешения, чтобы посмотреть, влияют ли они на производительность, но отставание сохранялось.
  • Уменьшение нагрузки на обработку: I упростили обработку модели, чтобы просто оценить два класса, но задержка сохраняется.
  • Поточность: мы попытались использовать многопоточность для отдельного захвата и обработки видео, но это не сильно уменьшило задержку.
Ожидаемые результаты:
Мне нужен более плавный видеопоток с меньшей задержкой, аналогичный необработанному видео с веб-камеры. Цель — обеспечить обработку и представление данных в режиме реального времени без видимых задержек.

Подробнее здесь: https://stackoverflow.com/questions/785 ... hon-script
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»