我正在尝试使用OpenCV获得一个非常简单的VideoCapture
,在这里我可以更改图片之间的分辨率。
我的设置:
- Debian GNU/Linux 11(牛眼(
- Python 3.9.2
- OpenCV 4.5.1
在最简单的步骤中,OpenCV已经向我发出警告,我不理解
import cv2
cap = cv2.VideoCapture(0)
中的结果
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (961) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
我搜索了这个警告,但只找到了应该已经解决的OpenCV问题的链接(例如,请参阅此处(。
无论如何,警告并不是禁止性的,因为我可以从相机中看到图像,并且我可以使用cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
和cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
将相机解决方案从3264x2448
缩小到640x480
。真正的问题发生在我试图将帧大小更改回原来的时候:
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH), cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# Prints: 3264.0 2448.0
org_w = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
org_h = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH), cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
cap.set(cv2.CAP_PROP_FRAME_WIDTH, org_w)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, org_h)
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH), cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
这会导致一系列警告,宽度和高度值被设置为0x0
:
[ 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 (992) getProperty OpenCV | GStreamer warning: GStreamer: no pipeline
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (992) getProperty OpenCV | GStreamer warning: GStreamer: no pipeline
0.0 0.0
然后cv2.imshow
失败。这不是在图片之间更改相机分辨率的正确方法吗?我应该把相机留在原来的3264x2448
中,在拍摄图像后只使用cv2.resize
来缩小图像大小吗?
在此处找到解决方案。注意到我的OpenCV是用v4l2
构建的,的问题消失了
cap = cv2.VideoCapture(0, cv2.CAP_V4L2)
可以使用找到构建信息
print(cv2.getBuildInformation())