簡體   English   中英

如何使用 opencv-python 代碼在樹莓派 4b 上使用 MJPG 而不是 YUYV 錄制視頻

[英]How can I record a video with MJPG instead of YUYV on a raspberry PI 4b with opencv-python code

來自 stackoverflow 的親愛的開發人員,祝您有個美好的一天。 我目前正在使用以下代碼在我的樹莓派上使用我的 usb 網絡攝像頭錄制實時視頻:

import cv2 as cv
import time

class CameraInst():
    # Constructor...
    def __init__(self):
                                   
        cap = cv.VideoCapture(0)  # Capture Video...
          
        cap.set(cv.CAP_PROP_FOURCC, cv.VideoWriter_fourcc('M','J','P','G'))
        
        cap.set(cv.CAP_PROP_FPS, 15)

        cap.set(cv.CAP_PROP_FRAME_WIDTH, 1920)
        
        cap.set(cv.CAP_PROP_FRAME_HEIGHT, 1080)
       
       
        self.cap=cap
                
        print("Aufnahme wird vorbereitet")
        time.sleep(1)

    def captureVideo(self):
        # Capture
        ret, self.frame = self.cap.read()
        cv.moveWindow('frame',0,0)
        cv.imshow('frame',self.frame)
       
        
       
def main():
    cam1 = CameraInst()

    while(True):
        # Display the resulting frames...
        cam1.captureVideo()    # Live stream of video on screen...
        if cv.waitKey(1) & 0xFF == ord('q'):
            break

if __name__=='__main__':
    main()


當我使用 cap.set(cv.CAP_PROP_FPS, 15) function 並且我不知道我做錯了什么時,代碼不再起作用。

我收到以下錯誤:

[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (961) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (1214) setProperty OpenCV | GStreamer warning: GStreamer: unhandled property
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (1824) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Internal data stream error.
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (536) startPipeline OpenCV | GStreamer warning: unable to start pipeline
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (1085) setProperty OpenCV | GStreamer warning: no pipeline
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (1085) setProperty OpenCV | GStreamer warning: no pipeline
Aufnahme wird vorbereitet
Traceback (most recent call last):
  File "/home/pi/Documents/RPV_Video_V8.py", line 45, in <module>
    main()
  File "/home/pi/Documents/RPV_Video_V8.py", line 40, in main
    cam1.captureVideo()    # Live stream of video on screen...
  File "/home/pi/Documents/RPV_Video_V8.py", line 31, in captureVideo
    cv.imshow('frame',self.frame)
cv2.error: OpenCV(4.5.1) ../modules/highgui/src/window.cpp:376: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'

問題是,如果我刪除 cap.set(cv.CAP_PROP_FPS, 15) 那么代碼可以正常工作,但隨后攝像機使用 YUYV 而不是 MJPG 進行記錄。

CAP_PROP_FOURCC屬性設置為MJPG

有關處理 fourcc 值的詳細信息,請查看 Video Writer (yes) 文檔。

cap.set(cv.CAP_PROP_FOURCC, cv.VideoWriter_fourcc(*"MJPG"))

.set()方法調用的順序很重要。 試着把這個放在第一位。 也許還可以設置CAP_PROP_FPS來確定。

還要確保進行正確的錯誤處理。

cap = ...
assert cap.isOpened()
ret, self.frame = self.cap.read()
if not ret:
    ... # handle this

如果后端是 gstreamer,或許可以更改它。

# Windows: CAP_DSHOW or CAP_MSMF
VideoCapture(..., apiPreference=cv.CAP_DSHOW)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM