Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video 从视频流中选择由给定采样间隔OPENCV分隔的所有图像_Video_Opencv_Sampling - Fatal编程技术网

Video 从视频流中选择由给定采样间隔OPENCV分隔的所有图像

Video 从视频流中选择由给定采样间隔OPENCV分隔的所有图像,video,opencv,sampling,Video,Opencv,Sampling,我正在使用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 sel

我正在使用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.
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;
}

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

尽管OpenCV确实包装ffmpeg用于视频读取,但ffmpeg可能更适合您描述的任务

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

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

您可以使用ffmpeg和Python的组合来提取所有帧

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

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.
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;
}

有一件事我不明白,
VideoCapture::set
将如何在矩阵
cv::Mat frame
中保存与我在变量
cur_interval
中保存的特定时间瞬间对应的值?查看您的代码
vc.set()
似乎与
cv::Mat frame
完全解耦,在
VideoCapture::set
的文档中,我找不到任何对矩阵变量的引用,该变量保存了帧。你能解释一下它是如何工作的吗?vc.set(CV\u CAP\u PROP\u POS\u MSEC,cur\u interval)只是设置视频捕获的当前时间戳。行if(vc>>frame)获取该时间戳之后的第一帧并保存到cv::Mat frame。对我来说足够清晰!非常感谢。我正在尽快尝试