Дополнительные байты Opencv для формата MJPG

#python #python-3.x #opencv #raspberry-pi

#python #python-3.x #opencv #raspberry-pi

Вопрос:

Я пытаюсь сохранить видео со своего usb-webacamera компьютера RP4 . Моя камера поддерживает эти форматы

 [0]: 'MJPG' (Motion-JPEG, compressed)
        Size: Discrete 1920x1080
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1280x720
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 800x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 320x240
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 176x144
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 800x600
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1920x1080
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.033s (30.000 fps)
    [1]: 'YUYV' (YUYV 4:2:2)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 320x240
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 176x144
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.033s (30.000 fps)

 

Я пытаюсь получить MJPG данные, потому default YUYV что имеет небольшое разрешение.

Я смог сохранить avi видео с разрешением 1920х1080 с помощью этого кода на python

 import cv2

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,1080)

cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"MJPG"))
cap.set(cv2.CAP_PROP_FPS, 30)

fourcc = int(cap.get(cv2.CAP_PROP_FOURCC))
fourcd = fourcc
fourcc = fourcc.to_bytes(4, 'little').decode('utf-8')
print("FOURCC="   str(fourcc))



fps = int(cap.get(cv2.CAP_PROP_FPS))
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))

print("FPS="   str(fps))
print(size)


result = cv2.VideoWriter('filename.avi', fourcd, fps, size)


while True:
    _, img = cap.read()
    result.write(img)

 

Но во время записи появляются эти ошибки

 
Corrupt JPEG data: 2989 extraneous bytes before marker 0xd9

 

и мое сохраненное видео действительно быстрое, оно становится медленнее, когда я уменьшаю разрешение. Означает ли это, что SD-карта не способна сохранять кадры так быстро, или Pi не способен обрабатывать сжатые кадры такого размера?

Ошибка ОБНОВЛЕНИЯ не возникает при снижении разрешения

Комментарии:

1. Зачем вам нужен mjpg? Это может быть проблемой для RPi4, но не уверен.

2. Я не уверен, но когда я делал то же самое со своей Jetson Nano камерой, и Gstreamer моя камера получала 1088 пикселей в cap.get(cv2.CAP_PROP_FRAME_HEIGHT). Может быть, проблемы могут быть в этом?

3. кстати. Я получаю тот же результат, что и при выполнении opencv установки, pip а также при сборке из исходного кода..

4. Вы не уверены, зачем вам нужна MJPG? Я вижу, что у RPi4 были некоторые проблемы: github.com/opencv/opencv/issues/5594 . Но это может быть решено.