我正在使用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方法实现这种方法的方法吗?
答案 0 :(得分: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;
}
答案 1 :(得分:0)
虽然OpenCV确实包装ffmpeg用于视频阅读,但ffmpeg可能更适合您描述的任务。
你可以获得Zeranoe的Windows版本here(假设你在Windows上,如果你在Linux上,你可能知道如何访问它)。如果您只想在Windows上使用命令行版本,请获取静态版本,否则获取开发版本。
Here是Dranger关于使用ffmpeg API开始编程的教程。
您可以使用ffmpeg和Python的组合使用this tutorial来提取所有帧。
HTH!