【发布时间】:2014-05-15 11:14:33
【问题描述】:
我正在 OpenCV (2.4.8) 中创建一个程序,它应该读取视频文件并对其进行一些计算。对于这些计算,我不需要高分辨率帧,我完全可以使用 640*360 作为分辨率。
在早期测试中,我连接了网络摄像头并使用了:
VideoCapture cap(0);
cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 360);
Mat image;
cap.read(image);
namedWindow("firstframe", 1);
imshow("firstframe", image);
waitKey(0);
完美地调整了图像的大小。现在我要进入下一步,我想将我的程序用于存储视频,而不是实时提要(我用于测试)。 当我用源文件路径(字符串)更改“0”时,文件被加载,但分辨率仍然是 1920*1080。
我做错了吗?有没有办法“即时”以较低的分辨率加载视频?
我已阅读 OpenCV 文档。一些设置标记为“仅限相机”,但此设置不是: http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture-videocapture
我在 Mac 上使用 OpenCV,并使用 MacPorts 安装它。
如果需要更多详细信息,请告诉我。
感谢您的帮助
编辑: 我已经意识到 cap.set(...) 函数返回一个布尔值,所以我尝试将它们打印出来,它们都返回 0。这当然证实了框架没有调整大小。仍然不知道为什么......
编辑 2: 所以现在,作为一个临时解决方案,我在 read(image) 之后使用以下行:
resize(image, image, Size(640, 360), 0, 0, INTER_CUBIC);
这很有效。但我猜这并不是最理想的解决方案。
【问题讨论】:
-
当您有网络摄像头时,您可以设置获取图像的分辨率,但是当您加载视频时,分辨率会在那里编码。我看到的唯一方法是像你一样调整图像的大小。
-
谢谢,我也是这么想的。分辨率的变化可能直接在网络摄像头上的硬件中完成。我的猜测是 ffmpeg 会在启用此选项的情况下即时调整大小。但话又说回来,这应该与我的 resize 语句在计算方面相同。
标签: opencv resolution video-capture dimensions