C# 查找视频中特定秒的图像

C# 查找视频中特定秒的图像,c#,image,video-processing,emgucv,C#,Image,Video Processing,Emgucv,我正在尝试在特定秒从视频中提取图像。例如,如果我使用3秒,则图像应在每3秒后从视频文件中提取。我使用emgu cv来实现这一点,但问题是,它从视频中获取所有帧。我不明白如何设置秒。 这是我的代码: private List<Image<Bgr, Byte>> GetVideoFrames(String Filename) { try { List<Image<Bg

我正在尝试在特定秒从视频中提取图像。例如,如果我使用3秒,则图像应在每3秒后从视频文件中提取。我使用emgu cv来实现这一点,但问题是,它从视频中获取所有帧。我不明白如何设置秒。 这是我的代码:

 private List<Image<Bgr, Byte>> GetVideoFrames(String Filename)
        {
            try
            {
                List<Image<Bgr, Byte>> image_array = new List<Image<Bgr, Byte>>();
               _capture = new Capture(Filename);


                bool Reading = true;
                int frameNumber = 10;
                int count = 0;
                while (Reading)
                {
                    Image<Bgr, Byte> frame = _capture.QueryFrame();
                    if (frame != null)
                    {
                        image_array.Add(frame.Copy());
                        //if(count>=frameNumber && count%frameNumber==0)
                        //{
                            image_array[count].Save(@"D:\SVN\Video Labeling\Images\"+count+".png");
                        //}
                        count++;
                    }
                    else
                    {
                        Reading = false;
                    }

                }

                return image_array;
            }
            catch (Exception ex)
            {

                throw;
            }
        }

FFMpeg非常适合视频操作和转换。您不需要使用emgucv,使用ffmpeg就可以轻松完成

下面还提供了带有emgucv的版本

并提供了您需要的参数

示例代码

如果你想在EMGUCV中找到答案,就在这里

string pathToVideo = @"<enter the video path here>";
int xSeconds = 10;
string imageName = @"D:\SVN\Video Labeling\Images\"+count+".png";

Process process = new Process();
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.FileName = Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName) +
                    @"\bin\ffmpeg.exe";

process.StartInfo.Arguments = String.Format("-i {0} -vf fps=1/{1} {2}%04d.bmp",pathToVideo,xSeconds,imageName);


process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.Start();
    private List<Image<Bgr, Byte>> GetVideoFrames(String Filename,int secondsToSkip)
    {
        try
        {
            List<Image<Bgr, Byte>> image_array = new List<Image<Bgr, Byte>>();
            _capture = new Capture(Filename);

            double fps = _capture.GetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FPS);

            Image<Bgr, Byte> frame = null;
            bool reading = true;
            double framesToSkip = secondsToSkip * fps;

            for (int count=1; reading; count++)
            {
                if(count%framesToSkip != 0)
                    _capture.QuerySmallFrame(); 
                else
                { 
                    frame = _capture.QueryFrame();
                    reading = (frame != null);
                    if (reading)
                    {
                        image_array.Add(frame.Copy());
                        image_array[count].Save(@"D:\SVN\Video Labeling\Images\" + count + ".png");
                    }
                }

            }

            return image_array;
        }
        catch (Exception ex)
        {
            throw;
        }
    }