OpenCV медленно читает видео в многопоточности
У меня есть проблема что при многопоточности 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()
Ответы (1 шт):
Предлагаю ознакомиться с 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()