Я хочу запустить несколько mp4
видео внутри процесса, но работает только трансляция с камеры. Программное обеспечение зависает без сообщения об ошибке. Я уже пробовал оба и обнаружил, что это не работает. Печать — это место, где застревает код.
import cv2
import multiprocessing
dispW=640
dispH=480
# Camera inputs
cap=cv2.VideoCapture('/home/kc/Downloads/darknet/1.mp4')
cap.set(cv2.CAP_PROP_FRAME_WIDTH, dispW)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, dispH)
#cv2.namedWindow("Window")
def c1():
global cap
while True:
print('here')
success, img = cap.read()
#ret, frame1 = cap1.read()
#frame2 = numpy.hstack((frame,frame1))
print('here')
cv2.imshow("Window2", img)
#This breaks on 'q' key
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
tCap1 = multiprocessing.Process(target=c1)
tCap1.start()
это работает.
import cv2
import multiprocessing
dispW=640
dispH=480
# Camera inputs
cap=cv2.VideoCapture('/dev/video0')
cap.set(cv2.CAP_PROP_FRAME_WIDTH, dispW)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, dispH)
#cv2.namedWindow("Window")
def c1():
global cap
while True:
success, img = cap.read()
#ret, frame1 = cap1.read()
#frame2 = numpy.hstack((frame,frame1))
print('here')
cv2.imshow("Window2", img)
#This breaks on 'q' key
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
tCap1 = multiprocessing.Process(target=c1)
tCap1.start()
Мне нужен пример запуска файла mp4 в многопроцессорном режиме.
код работает для меня (в Linux Mint), если я создаю cap
внутреннюю функцию. Мультипроцессы не разделяют память, поэтому создание cap
в основном процессе и последующее использование global
не очень хорошая идея. Другая проблема заключается в том, что когда он создает новый процесс, основной поток сохраняет все в файле с помощью рассола, и новый поток должен его прочитать - и для файла он может работать не так, как ожидалось.
Код работает для меня, используя raspberry pi 4 (linux)
Вот минимальный рабочий пример с дополнительным контролем FPS. Если вам нужно извлечь кадры из вашего процесса обратно в основную программу, вы можете использовать multiprocessing.Queue()
для передачи кадров, поскольку мультипроцессы имеют независимый стек памяти.
import multiprocessing as mp
import cv2, time
def capture_frames():
src = 'test.mp4'
capture = cv2.VideoCapture(src)
capture.set(cv2.CAP_PROP_BUFFERSIZE, 2)
# FPS = 1/X, X = desired FPS
FPS = 1/120
FPS_MS = int(FPS * 1000)
while True:
# Ensure camera is connected
if capture.isOpened():
(status, frame) = capture.read()
# Ensure valid frame
if status:
cv2.imshow('frame', frame)
else:
break
if cv2.waitKey(1) & 0xFF == ord('q'):
break
time.sleep(FPS)
capture.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
print('Starting video stream')
capture_process = mp.Process(target=capture_frames, args=())
capture_process.start()
Связанные сообщения камеры/IP/RTSP/потоковой передачи, FPS, видео, многопоточности и многопроцессорности
вы не могу установить ширину/высоту видео, которое вы читать -- всегда проверяйте:
assert cap.isOpened()
один раз после создания объекта VideoCapture