OpenCV捕获带有黑色边栏的imagem

时间:2018-08-27 16:44:07

标签: python opencv

我尝试使用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:

Image with black sides

使用Windows摄像头:

enter image description here

4 个答案:

答案 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);

检查!