我尝试使用cv2.VideoCapture和比例为16:9的相机捕获照片和视频。但是所有图像都是由OpenCV返回的,带有黑色的一面,裁剪了图像。在我的示例中,它不返回1280 x 720的图像,而是返回960 x 720的图像。使用网络摄像头C920(1920 x 1080)也会发生同样的情况。
我做错了什么?
import cv2
video = cv2.VideoCapture(0)
video.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
video.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
while True:
conected, frame = video.read()
cv2.imshow("Video", frame)
if cv2.waitKey(1) == ord('s'):
video.release()
break
cv2.destroyAllWindows()
使用OpenCV:
使用Windows摄像头:
答案 0 :(得分:4)
我在Windows摄像头中使用Logitech广角遇到了这个确切问题,我想知道驱动程序问题。
因此,我使用DirectShow驱动程序而不是使用本机驱动程序解决了这个问题:
cv2.VideoCapture(cv2.CAP_DSHOW)
如果您有多个摄像头,则将索引添加到该值,像这样
cv2.VideoCapture(cv2.CAP_DSHOW + camera_index)
它将通过应用正确的宽高比而没有侧边栏来接受所需的分辨率。
答案 1 :(得分:2)
我也遇到了同样的问题,但仅在Windows 10,OpenCV 3.4和Python 3.7上。 在Mac OS上没有黑边的情况下,我可以获得完整的分辨率。
我使用PyGame捕获了摄像头输入,并在Windows上获得了1920x1080的完整分辨率。
答案 2 :(得分:0)
@luismesas的答案是完全正确的,并为我工作。
但是对于像我这样不熟练的人,您需要保存cv2.VideoCapture返回的捕获。不是像cv2.VideoCapture(cv2.CAP_DSHOW)这样可以设置的参数,而是一种方法。
camera_index = 0
cap = cv2.VideoCapture(camera_index, cv2.CAP_DSHOW)
ret, frame = cap.read()
已在网络摄像头设备HD PRO WEBCAM C920上确认。
答案 3 :(得分:-1)
只需调整接收到的帧的大小:
cv::Mat dst;
cv:resize(frame,dst,cv::Size(1280,720));
cv::imshow("Video",dst);
检查!