opencv Python cv2,更改相机分辨率

c0vxltue  于 2022-11-15  发布在  Python
关注(0)|答案(1)|浏览(169)

我试图得到一个非常简单的VideoCapture去与OpenCV,在那里我能够改变图片之间的分辨率。
我的设置:

  • 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问题的链接(例如,请参见here)。
无论如何,这个警告并不是禁止的,因为我可以看到相机的图像,我可以使用cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)将相机的rresolution从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))

这将导致一系列警告,并且width和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失败ofc.这不是在图片之间改变相机分辨率的正确方法吗?我应该让相机保持原来的3264x2448,而只是在拍摄图像后使用cv2.resize来缩小图像尺寸吗?

pod7payv

pod7payv1#

找到了解决方案here。注意到我的OpenCV是用v4l2构建的,问题就消失了

cap = cv2.VideoCapture(0, cv2.CAP_V4L2)

构建信息可通过以下方式找到

print(cv2.getBuildInformation())

相关问题