2

我正在将 OpenCV 用于一个项目,但我完全是初学者。

我的大容量存储库中有一个视频文件,并且想编写一个方法来访问由输入中给定采样间隔分隔的视频流的所有帧。

视频可以是多种格式(AVI – WMV – MPEG-2 – MPEG-4)。

我在想该方法应该像这样工作:

1. Have as input a desired sampling interval
2. Access the video at timestamp corresponding to the sampling interval
3. Save selected frame of video as an image
4. Go to next frame as determined from sampling frequency.

您能帮我提供一些代码,或者至少说明使用 OpenCV 方法实现这种方法的方法吗?

4

2 回答 2

2

您可以查看VideoCapture::set方法并使用 CV_CAP_PROP_POS_MSEC 从视频文件中获取特定帧。虽然我没有测试这段代码,但它会是这样的:

cv::VideoCapture vc(video_file_name);
cv::Mat frame;

//How you will get the interval is up to you
float interval = getInterval();
float cur_interval = 0;

while(1)
{
   vc.set(CV_CAP_PROP_POS_MSEC, cur_interval);

   //The operator>> will return a NULL pointer if the next frame isn't valid
   if(vc >> frame)
     cv::imwrite("filename.jpg", frame);
   else
     break;

   cur_interval += interval;
}
于 2012-01-03T17:26:13.673 回答
0

尽管 OpenCV 确实为视频阅读包装了 ffmpeg,但 ffmpeg 可能更适合您描述的任务。

您可以在此处获取 Zeranoe 的 Windows 版本(假设您在 Windows 上,如果您在 Linux 上,您可能知道如何访问它)。如果您只想在 Windows 上使用命令行版本,请获取静态构建,否则获取开发构建。

是 Dranger 关于开始使用 ffmpeg API 进行编程的教程。

您可以使用本教程结合 ffmpeg 和 Python来提取所有帧。

于 2012-01-03T15:37:59.987 回答