【发布时间】:2017-07-04 17:09:03
【问题描述】:
我正在使用 OpenCV 2.4.9 并尝试打开视频。 isOpened() 成功运行,但是当我尝试查看视频的帧数时,它返回 0,我无法访问视频的帧数。我拥有的每个视频都会发生这种情况。我可以在不同的机器上使用相同的视频(问题发生在我的 CentOS 7 VM 中,视频位于共享文件夹中,主机操作系统可以在 OpenCV 中正常访问它们)。安装了 Ffmpeg,我可以ffplay 视频和ffmpeg -i 告诉我视频的帧数非零。我的 OpenCV 用 ffmpeg 编译成功:
" Video I/O:\n"
" DC1394 1.x: NO\n"
" DC1394 2.x: YES (ver 2.2.2)\n"
" FFMPEG: YES\n"
" codec: YES (ver 56.26.100)\n"
" format: YES (ver 56.25.101)\n"
" util: YES (ver 54.20.100)\n"
" swscale: YES (ver 3.1.101)\n"
" gentoo-style: YES\n"
" GStreamer: \n"
" base: YES (ver 0.10.36)\n"
" app: YES (ver 0.10.36)\n"
" video: YES (ver 0.10.36)\n"
" OpenNI: NO\n"
" OpenNI PrimeSensor Modules: NO\n"
" PvAPI: NO\n"
" GigEVisionSDK: NO\n"
" UniCap: NO\n"
" UniCap ucil: NO\n"
" V4L/V4L2: Using libv4l (ver 0.9.5)\n"
" XIMEA: NO\n"
" Xine: NO\n"
"\n"
我的代码可以正确编译,我可以使用 OpenCV 读取图像。
代码非常基础。对于 Python:
import cv2
cap = cv2.VideoCapture('test.mp4')
print cap.isOpened()
print cap.get(cv2.cv.CV_CAP_PROP_FPS)
print cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)
>> True
>> 0.0
>> 0
对于 C++:
#include "opencv2/opencv.hpp"
#include <stdio.h>
#include <stdlib.h>
using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
cv::VideoCapture cap;
cap.open("test.mp4");
if(cap.isOpened())
{
cout >> cap.get(CV_CAP_PROP_FPS) >> endl;
cout >> cap.get(CV_CAP_PROP_FRAME_COUNT) >> endl;
}
return(0);
}
也打印 0。
【问题讨论】:
-
您可以尝试使用 VideoWriter 类(例如 mjpg 编解码器)编写视频,然后尝试加载该视频吗?
-
我这样做了。即使视频渲染正确,我仍然得到 0 fps。
-
嗯,是的,这很尴尬。它确实读取了框架,我可以显示它。那为什么
cap.get()会骗我呢? -
我相信这在 OpenCV 3.2 中已修复。 @ShivamGaur
-
哦,好的。在将 python 包装器用于 opencv 3.2 时,我确实遇到了同样的问题(CAP_PROP_FRAME_COUNT 返回 0 帧)。但能够通过安装
ffmpeg-devel来修复它