如何使用 opencv-python 代码在 raspberry PI 4b 上使用 MJPG 而不是 YUYV 录制视频
How can I record a video with MJPG instead of YUYV on a raspberry PI 4b with opencv-python code
亲爱的 Whosebug 开发人员,您好!
我目前正在使用我的 raspberry Pi 上的 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) 函数时,我不知道自己做错了什么。
我收到以下错误:
[ 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
。
查看视频Writer(是)文档以获取有关处理 fourcc 值的详细信息。
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)
亲爱的 Whosebug 开发人员,您好! 我目前正在使用我的 raspberry Pi 上的 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) 函数时,我不知道自己做错了什么。
我收到以下错误:
[ 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
。
查看视频Writer(是)文档以获取有关处理 fourcc 值的详细信息。
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)