Python OpenCV访问网络摄像头最大分辨率

vql8enpb  于 2023-08-06  发布在  Python
关注(0)|答案(7)|浏览(152)

我试图从我的网络摄像头获取图像使用python代码导入OpenCV。代码如下:

import sys
sys.path.append("C:\\opencv\\build\\python\\2.7")
import cv2
import cv2.cv as cv
import time

# Set resolution
cap = cv2.VideoCapture(0)
print "Frame default resolution: (" + str(cap.get(cv.CV_CAP_PROP_FRAME_WIDTH)) + "; " + str(cap.get(cv.CV_CAP_PROP_FRAME_HEIGHT)) + ")"
cap.set(cv.CV_CAP_PROP_FRAME_WIDTH, 800)
cap.set(cv.CV_CAP_PROP_FRAME_HEIGHT, 600)
print "Frame resolution set to: (" + str(cap.get(cv.CV_CAP_PROP_FRAME_WIDTH)) + "; " + str(cap.get(cv.CV_CAP_PROP_FRAME_HEIGHT)) + ")"

# Acquire frame
capture = cv.CreateCameraCapture(0)
img = cv.QueryFrame(capture)

字符串
代码工作正常,除了相机默认分辨率为640 x480,我的代码似乎只能设置低于此的分辨率值。例如,我可以将图像大小设置为320 x240,但不能将其更改为800 x600。我没有出现错误:简单地说,分辨率设置为默认值(640 x480),因为我试图将其设置为更高的值。
我使用的摄像头(没有其他网络摄像头连接到计算机)是QuickCam V-UBK 45:使用罗技提供的软件,我能够以全分辨率(1280 X960)和所有中间分辨率(eidogg)拍照。800x600)。
因此,硬件支持这些帧大小,但我的代码无法访问它们。
有人知道我能做什么吗?

yzxexxkh

yzxexxkh1#

上述问题是由摄像头驱动程序引起的。我能够修复它使用直接显示作为后端。我读到(抱歉,但我不记得在哪里),几乎所有的相机都提供了一个驱动程序,允许他们从DirectShow使用。因此,我在Windows中使用DirectShow与相机进行交互,我能够按照我想要的方式配置分辨率,并获得相机的本地宽高比(16:9)。
你可以试试这段代码,看看它是否适合你:

import cv2

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) # this is the magic!

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

r, frame = cap.read()
...
print('Resolution: ' + str(frame.shape[0]) + ' x ' + str(frame.shape[1]))

字符串
在OpenCV文档中,我为那些想了解更多关于OpenCV后端(OpenCV docs)的人找到了以下信息
希望这能帮到你!

hiz5n14c

hiz5n14c2#

我使用不同的分辨率从List of common resolutions循环设置图像分辨率

def set_res(cap, x,y):
    cap.set(cv.CV_CAP_PROP_FRAME_WIDTH, int(x))
    cap.set(cv.CV_CAP_PROP_FRAME_HEIGHT, int(y))
    return str(cap.get(cv.CV_CAP_PROP_FRAME_WIDTH)),str(cap.get(cv.CV_CAP_PROP_FRAME_HEIGHT))

字符串
OpenCV或我的相机似乎只允许某些分辨率。

  • 160.0 x 120.0
  • 176.0 x 144.0
  • 320.0 x 240.0
  • 352.0 x 288.0
  • 640.0 x 480.0
  • 1024.0 x 768.0
  • 1280.0 x 1024.0
p1iqtdky

p1iqtdky3#

我让它工作,所以这篇文章是为其他人遇到同样的问题:

Logitech C270也是如此。由于某种原因,它只会显示640x480,即使网络摄像头支持1280x720。同样的问题仍然存在与内置网络摄像头在我的笔记本电脑。
如果我在代码中将其设置为800x600,则显示为640x480。但是,如果我将其设置为1024x768,则会变为800x600。如果我把它设置为2000x2000之类的愚蠢的东西,它就变成了1280x720。
这是在OpenCV 3.0上的C++中,但也许它也适用于Python。

cl25kdpy

cl25kdpy4#

尝试以下代码以获得最大相机分辨率,使用此代码您可以使用最大分辨率拍摄照片或视频:

import cv2

HIGH_VALUE = 10000
WIDTH = HIGH_VALUE
HEIGHT = HIGH_VALUE

capture = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
capture.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)
width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))

print(width,height)

字符串

eufgjt7s

eufgjt7s5#

对于cv2,只需更改为此。

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600)

字符串

lokaqttq

lokaqttq6#

OpenCV现在只允许这些分辨率。
1.'320.0x240.0':好的
1.'640.0x480.0':好的
1.'1280.0x720.0':好的
来源:https://www.learnpythonwithrune.org/find-all-possible-webcam-resolutions-with-opencv-in-python/
这些是共同的决议。它可能支持更多的分辨率,您可以检查。如果找不到支持的解决方案。您还可以用途:

frame = imutils(frame, width = 720)

字符串
这将使您获得更接近的支持分辨率。注意:使用所需的宽度值,并将其设置为更接近支持的分辨率,然后您可以使用以下命令检查支持的分辨率:

print(frame.shape)


imutils方法完全基于经验和周围的测试。

drkbr07n

drkbr07n7#

以下是我能够使用的

import cv2
import platform
index = 0 # capture device index

if platform.system() == "Windows":
    cv2.CAP_DSHOW
    #sets the Windows cv2 backend to DSHOW (Direct Video Input Show)
    cap = cv2.VideoCapture(index)
elif platform.system() == "Linux":
    cv2.CAP_GSTREAMER # set the Linux cv2 backend to GTREAMER
    #cv2.CAP_V4L
    cap = cv2.VideoCapture(index)
else:
    cap = cv2.VideoCapture(index)
    # For MAC please refer to link below for I/O
    cap.set(cv2.CAP_FFMPEG, cv2.CAP_FFMPEG_VIDEOTOOLBOX) # not sure!
    #please refer to reference link at bottom of page for more I/O

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 3840) # 4k/high_res
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 2160) # 4k/high_res
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print(width, height)

_, frame = cap.read()
height, width = frame.shape[:2]
print(width, height)

cap.release()
#while True:
    #pass if your terminal closes automatically

字符串

相关问题