如何使用Perl比较两个文件夹中的更多图像数量

时间:2012-12-06 09:56:08

标签: image perl matlab compare frame

我对Perl并不陌生,我需要任何人帮助完成一个奇怪的要求。

  1. 我想逐帧比较两个视频。我可以使用AVISYNTH直接比较它们,但问题是两个视频都是相同的,但初始帧会在不同的时间开始。

  2. 为此我将每个视频分成帧/图像并将它们分别存储在两个文件夹中

  3. 现在我想比较第一个文件夹的frame1 / image1和第二个文件夹的所有初始10-15个图像。

  4. 如果第二个文件夹的第四个图像匹配,则需要进一步停止该过程,并将第4帧存储/处理为第二个文件夹的索引。

  5. 一旦完成,我想开始两个文件夹之间的图像的实际比较。 即文件夹1的图像1,文件夹2的图像4 文件夹1的图像2与文件夹2的图像5 文件夹1的图像3与文件夹2的图像6 ...依此类推

  6. 我想在perl / Matlab中完成所有这些过程。任何身体都可以帮助我,请你提出想法或建议。

    由于 Ganesh

1 个答案:

答案 0 :(得分:1)

假设我们有一个子程序compare_frames可以比较两个帧,如果相同则返回true。

然后我们可以通过循环文件夹2中的前几帧并比较帧来找到偏移量:

# return the offset of the first equal image,
# searching frames between "from" (defaulting to 1) and "upto" (defaulting to 15)
sub find_offset (%) {
   my ($min_index, $max_index) = @{+{ from=>1, upto=>15, @_ }}{qw(from upto)};
   for my $index ($min_index .. $max_index) { # assuming 1-based indexing scheme
      return $index - 1 if compare_frames(1, $index);
   }
   warn "no offset found";
   return undef; # or better, exit the program.
}

在脚本的主要部分中,您将运行my $offset = find_offset upto=>15并稍后将其用于大部分处理。但是,这假定文件夹1始终是文件夹2的子集。

在我们的比较子程序中,我们希望尽快返回“false”。根据图像格式,我们可以说如果两个图像的大小不同,则它们不能相等。但是,位图具有固定的大小,因此这在这里没有意义,因为所有帧具有相同的分辨率。其他图像格式具有不同的压缩密度,其中两个图像可能相等,即使一个更加压缩。在这种情况下,请删除stat代码。

# decide if two frames are equal.
# $frame1 is from the first set of frames,
# $frame2 is the frame from the second set.
sub compare_frames {
   my ($frame1, $frame2) = @_;
   my $file1 = "folder1/$frame1";
   my $file2 = "folder2/$frame1";
   # stat the files for the size.
   my $size1 = (stat $file1)[7];
   my $size2 = (stat $file2)[7];
   return 0 if $size1 != $size2; # strict equality, maybe you want to include some sort of tolerance.
   # do main comparision
   $cmp->set_image1($file1);
   $cmp->set_image2($file2);
   return $cmp->compare;
}

其中$cmp是来自Image::Compare的比较器对象,以及预设的比较方法。

然后,在主要比较期间,你会compare_frames($i, $i + $offset)