如何使用OpenCV和Python比较视频和参考视频?

2024-09-24 06:30:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要比较两个视频,并检查它们是否相同。这项检查实际上是为了找出视频是否包含任何伪影。在

我有一个ref视频,捕获的视频必须与之进行比较。 视频将在同一时间从两个不同的机顶盒中捕获。其中一个将运行一个无伪影视频,另一个机顶盒将与稳定的机顶盒进行对比测试。不需要考虑外部条件。在

一种方法是将两个视频分成帧,然后比较每个帧。我不想这样做,因为这将是一个非常漫长的过程,当我有60帧的高分辨率视频。在

如何在中使用?在


Tags: 方法numpyref视频matplotlib过程条件opencv
3条回答

根据PSNR示例,您同时运行两个视频,并比较两者的每个帧(当前时间点)视频。但是如果第一视频内容的1st分钟与第二或第三分钟的第二视频内容相匹配,该怎么办。PSNR不适合这种情况。你可以通过“动态编程的视频帧匹配算法” http://electronicimaging.spiedigitallibrary.org/article.aspx?articleid=1100207

如果你的意思是它们完全相同(即相同的格式、相同的文件类型等等),那么最简单的方法就是简单的文件比较,即只需逐字节比较每个文件。在

这也是唯一可以确定的测试——例如,它们可能几乎完全相同,但其中一个测试中途有一些损坏的字节。在

这种逐字节的比较比试图解码和解释存在的许多不同的视频格式要简单得多。在

您可以检查c++Video Input with OpenCV and similarity measurement的示例

这为您正在寻找的内容提供了参考。 我对Python不是很熟悉,但是由于opencv保持了相同的功能性,所以我认为yu可以从c++的例子中推断出来。在

最常用的算法是PSNR(又名峰值信噪比)。在

double getPSNR(const Mat& I1, const Mat& I2)
{
 Mat s1;
 absdiff(I1, I2, s1);       // |I1 - I2|
 s1.convertTo(s1, CV_32F);  // cannot make a square on 8 bits
 s1 = s1.mul(s1);           // |I1 - I2|^2

 Scalar s = sum(s1);         // sum elements per channel

 double sse = s.val[0] + s.val[1] + s.val[2]; // sum channels

 if( sse <= 1e-10) // for small values return zero
     return 0;
 else
 {
     double  mse =sse /(double)(I1.channels() * I1.total());
     double psnr = 10.0*log10((255*255)/mse);
     return psnr;
 }
}

但是如果你想要一个结构上的相似性,你可以使用下面的OpenCV实现。在

^{pr2}$

需要注意的是,由于你是逐帧(2个图像)比较,你必须循环视频以获得相应的对。在

相关问题 更多 >