我正在尝试从视频文件中提取特定的帧。当我用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是我想要匹配的固定帧。当我播放视频文件并提取新帧时,此代码工作正常,但我无法将新帧与特定帧进行比较。请指导我如何实现这一目标。
答案 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
包括示例。
答案 1 :(得分:0)
就我能理解你的问题而言,问题是你不能用这种方式比较图像和图像。我想你会发现这样做的方法是建立一个直方图表,然后比较图像直方图。
要研究的一些相关事项是:
image comparer class form VS 2015 unit testing
第二个来自单元测试库,所以不确定性能(还没有尝试过)