如何使用AForge库提取特定帧

时间:2014-01-04 04:58:39

标签: c# video image-processing video-capture video-processing

我正在尝试从视频文件中提取特定的帧。当我用aforge库播放视频文件时,我有一个框架。我调用一个新的帧事件,如果新帧与我的特定帧匹配,那么它会显示一条消息:“帧匹配”。此特定帧随机出现在视频文件中。这是我的代码:

private void Form1_Load(object sender, EventArgs e)
{
    IVideoSource videoSource = new FileVideoSource(@"e:\media\test\a.mkv");
    playerControl.VideoSource = videoSource;
    playerControl.Start( );
    videoSource.NewFrame += new AForge.Video.NewFrameEventHandler(Video_NewFrame );
}

private void Video_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
{
    //Create Bitmap from frame
    Bitmap FrameData = new Bitmap(eventArgs.Frame);
    //Add to PictureBox
    pictureBox1.Image   = FrameData;
    //compare current frame to specific fram
    if (pictureBox1.Image == pictureBox2.Image)
    {
        MessageBox.Show("Frame Match");  
    }
}

pictureBox2.image是我想要匹配的固定帧。当我播放视频文件并提取新帧时,此代码工作正常,但我无法将新帧与特定帧进行比较。请指导我如何实现这一目标。

2 个答案:

答案 0 :(得分:3)

你可以看看: https://github.com/dajuric/accord-net-extensions

var capture = new FileCapture(@"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv");
capture.Open();
capture.Seek(<yourFrameIndex>, SeekOrigin.Begin);
var image = capture.ReadAs<Bgr, byte>();

或者你可以使用标准的IEnumerable:

var capture = new FileCapture(@"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv");
capture.Open();
var image = capture.ElementAt(<yourFrameIndex>); //will actually just cast image

包括示例。

转移到:https://github.com/dajuric/dot-imaging

答案 1 :(得分:0)

就我能理解你的问题而言,问题是你不能用这种方式比较图像和图像。我想你会发现这样做的方法是建立一个直方图表,然后比较图像直方图。

要研究的一些相关事项是:

how to compare two images

image comparer class form VS 2015 unit testing

第二个来自单元测试库,所以不确定性能(还没有尝试过)