Многопроцессорная обработка Python OpenCV cv2.VideoCapture mp4

Я хочу запустить несколько 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 в многопроцессорном режиме.

вы не могу установить ширину/высоту видео, которое вы читать -- всегда проверяйте: assert cap.isOpened() один раз после создания объекта VideoCapture

Christoph Rackwitz 05.05.2022 02:40

код работает для меня (в Linux Mint), если я создаю cap внутреннюю функцию. Мультипроцессы не разделяют память, поэтому создание cap в основном процессе и последующее использование global не очень хорошая идея. Другая проблема заключается в том, что когда он создает новый процесс, основной поток сохраняет все в файле с помощью рассола, и новый поток должен его прочитать - и для файла он может работать не так, как ожидалось.

furas 05.05.2022 02:48

Код работает для меня, используя raspberry pi 4 (linux)

toyota Supra 11.05.2022 04:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот минимальный рабочий пример с дополнительным контролем 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, видео, многопоточности и многопроцессорности

  1. Потоковая передача Python OpenCV с камеры — многопоточность, метки времени

  2. Потоковое видео с IP-камеры в Python с использованием OpenCV cv2.VideoCapture

  3. Как захватить потоки с нескольких камер с помощью OpenCV?

  4. Захват потокового видео OpenCV в реальном времени работает медленно. Как пропустить кадры или синхронизироваться с реальным временем?

  5. Сохранение потока RTSP в виде видеофайла с помощью OpenCV VideoWriter

  6. Сохранение видео OpenCV

  7. Многопроцессорная обработка Python OpenCV cv2.VideoCapture mp4

Другие вопросы по теме