OpenCV медленно читает видео в многопоточности

Рейтинг: 1Ответов: 1Опубликовано: 18.06.2023

У меня есть проблема что при многопоточности opencv медленно читает видео, выдает 2 FPS, хотя ресурсы компьютера все свободные, задействованы лишь:

CPU (i7 3,6 ГГц): 1-2%, свободно остается 98%

RAM: 1ГБ / 64 ГБ

multiprocessing не подходит (или может я не корректно им пользуюсь), так как в дальнейшем будет распознавание объектов и он естественно выдает out of memory.

Я думал что проблема в кодеке видео h264 (хотя опять же повторюсь ресурсы свободны), но я все таки попробовал другие кодеки, все осталось также.

Подскажите в чем может быть проблема и какие есть варианты ее решения?

import cv2
import time
from threading import Thread,Semaphore


def start(i):
    video_path = "backups/3/2/2023-06-18_20-27-50.mp4"
    cap = cv2.VideoCapture(video_path, cv2.CAP_FFMPEG)
    while cap.isOpened():
        success, frame = cap.read()     
        if success:
            new_time = time.time() 
            elapsed_time  = new_time - prev_time

            if i == 14:
                fps = int(1/elapsed_time )
                cv2.putText(frame, str(int(fps)), (7, 70), cv2.FONT_HERSHEY_SIMPLEX, 3, (100, 255, 0), 3, cv2.LINE_AA)
                cv2.imshow("Inference", cv2.resize(frame,(960,540)))
            
            prev_time = new_time
            if cv2.waitKey(1) & 0xFF == ord("q"):
                break
        else:
            break

    cap.release()
    cv2.destroyAllWindows()
    


threads = []
i = 0
while i < 15:
    t = Thread(target=start,args=(i,))
    t.start()
    threads.append(t)
    i += 1
for t in threads:
    t.join()

Ответы

▲ 0

Предлагаю ознакомиться с API VideoGear. Вот пример использования с сайта abhitronix.github.io/vidgear

main.py

# import required libraries
from vidgear.gears import VideoGear
import cv2


# open any valid video stream(for e.g `myvideo.avi` file)
stream = VideoGear(source="myvideo.avi").start()

# loop over
while True:

    # read frames from stream
    frame = stream.read()

    # check for frame if Nonetype
    if frame is None:
        break

    # {do something with the frame here}

    # Show output window
    cv2.imshow("Output Frame", frame)

    # check for 'q' key if pressed
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        break

# close output window
cv2.destroyAllWindows()

# safely close video stream
stream.stop()