Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 如何使用Perl比较两个文件夹中更多的图像_Image_Perl_Matlab_Compare_Frame - Fatal编程技术网

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

Image 如何使用Perl比较两个文件夹中更多的图像,image,perl,matlab,compare,frame,Image,Perl,Matlab,Compare,Frame,我对Perl并不陌生,我需要任何人的帮助来完成一个奇怪的需求 我想逐帧比较两个视频。我可以直接使用AVISYNTH对它们进行比较,但问题是两个视频都是相同的,但初始帧的起始时间不同 为此,我将每个视频分割成帧/图像,并将它们分别存储在两个文件夹中 现在我想比较第一个文件夹的frame1/image1和第二个文件夹的所有初始10-15个图像 如果第二个文件夹的第4个图像匹配,则需要进一步停止该过程,并将第4帧存储/视为第二个文件夹的索引 完成后,我想开始实际比较两个文件夹之间的图像。 i、 e文件

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

  • 我想逐帧比较两个视频。我可以直接使用AVISYNTH对它们进行比较,但问题是两个视频都是相同的,但初始帧的起始时间不同

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

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

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

  • 完成后,我想开始实际比较两个文件夹之间的图像。 i、 e文件夹1的图像1与文件夹2的图像4 文件夹1的图像2与文件夹2的图像5 文件夹1的图像3与文件夹2的图像6。。。等等

  • 我想在perl/Matlab中完成所有这些过程。任何人都能帮我提出你的想法或建议吗

    谢谢
    Ganesh

    让我们假设我们有一个子例程
    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
    的比较器对象和预设比较方法


    然后,在主比较过程中,您将
    比较\u帧($i,$i+$offset)

    我已经开始使用perl进行一些工作,因此获得了比较两个图像的代码[还可以使用类似的代码将视频分割成帧。但是我开始执行上面的步骤2、4和5。@user1881906,你能在你的工作主题或代码中发布关于代码的链接吗?很高兴看到Iti amon,谢谢你的回复。虽然你做了非常详细的解释,但我对此有点困惑。下面是我用于比较图像的程序;使用Image::Compare;使用警告;使用strict;my($cmp)=Image::Compare->new();$cmp->set_image1(img=>'folder1/hdcapsdk0121205224416_3570.bmp',type=>'bmp',);$cmp->set_image2(img=>folder2/hdcapsdk0121205224416_3581.bmp',type=>'bmp',;$cmp->set_方法(method=>&Image::Compare::EXACT,);if($cmp->Compare()){print”两者相同:;}否则{print”两者不相同:;}。因此,我只想根据您的代码了解以下内容:我需要为$file1='folder1/$frame1'@user1881906提供什么输入如果帧位于这样的位置,并且每个帧的偏移量为3570,那么我将把它写成
    my$file1=“folder1/$basename”。(3570+$frame1)。.bmp
    对于
    $file2
    也是一样,其中
    $basename
    是一个配置参数,其值为
    hdcapsdk0121205224416
    。然后您将传递帧号(在您的示例中为0或11)我提出的
    compare\u frames
    只是对您刚才提供的代码的抽象,将所有常见的操作分解出来。@amon可能(1..15)必须是函数的参数?是的,在
    find\u offset
    中为范围的上限取一个参数是明智的。