2014-04-03 57 views
9

我正在OpenCV(2.4.8)中创建一个应读取视频文件并对其进行计算的程序。对于这些计算,我不需要高分辨率的帧,我完全可以用640 * 360作为分辨率。更改OpenCV视频文件的分辨率

在早期的测试中,我有我的网络摄像头连接,我用:

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: 所以现在,临时解决方案,我用后读(图)以下行:

resize(image, image, Size(640, 360), 0, 0, INTER_CUBIC); 

而这个工作。但我猜测这不是最理想的解决方案。

+0

当你有一个网络摄像头,你可以设置获取图像的分辨率,但是当你加载一个你的视频有分辨率编码。我所看到的唯一方法就是像调整图像一样调整图像大小。 –

+0

谢谢,我在想同样的事情。分辨率的变化可能直接在网络摄像头的硬件上完成。我的猜测是ffmpeg会在启用此选项的情况下实时调整大小。但是,再次,这应该与我的调整大小声明相同的计算方式。 – user3319803

回答

8

使用

resize(image, image, Size(640, 360), 0, 0, INTER_CUBIC); 

后读(图)似乎是解决这个问题的最佳解决方案。 所以总的(测试)的代码就变成了:

VideoCapture cap("path/to/file"); 
cap.set(CV_CAP_PROP_FRAME_WIDTH, 640); 
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 360); 
Mat image; 
cap.read(image); 
resize(image, image, Size(640, 360), 0, 0, INTER_CUBIC); 
namedWindow("firstframe", 1); 
imshow("firstframe", image); 
waitKey(0); 

如果有人有更好的办法知道,请让我知道。