检测bash中的视频是否为黑白

时间:2018-10-12 09:47:31

标签: bash video

我有一个包含数百个电影的文件夹,我想将彩色电影与黑白电影分开。是否有bash命令可以对常规视频文件执行此操作?

我已经提取了一个帧:

ffmpeg -ss 00:15:00 -i vid.mp4 -t 1 -r 1/1 image.bmp

如何检查图像是否具有颜色成分?

1 个答案:

答案 0 :(得分:1)

我从来没有发现为什么会在SO上回答视频处理问题的原因,但是由于通常情况下这些问题不会被解决,所以我会尽力而为...由于这是开发人员委员会,因此我不建议您使用任何现成的命令行工具bash命令,我也不知道。我也不能给出仅bash的解决方案,因为我不知道如何在bash中处理二进制数据。

要弄清图像是否为灰色,您需要检查每个像素的颜色,如果颜色为灰色则“猜测”。正如其他人在评论中所说,您将需要分析每个视频的多张图片以获得更准确的结果。为此,您可以使用ffmpeg的场景变化检测过滤器,但这就是另一个主题。

我将首先调整图像大小以节省处理能力,例如到4x4像素还要确保您知道色彩空间或更佳的pix_format,以便您知道像素的外观。

使用此ffmpeg行,您可以将4x4像素的一帧提取到原始RGB24:

ffmpeg -i D:\smpte.mxf -pix_fmt rgb24 -t 1 -r 1/1 -vf scale=4:4 -f rawvideo d:\out_color.raw

生成的文件正好包含48个字节,每个3个字节16个像素,代表R,G,B颜色。为了检查所有像素是否都是灰色,您需要比较R G和B之间的差异。通常R G和B在灰色时具有相同的值,但实际上您将需要更多的模糊匹配,例如如果所有值都相同,则为+ -10。

一些示例perl代码:

use strict;
use warnings;

my $fuzz = 10;
my $inputfile ="d:\\out_grey.raw";
die "input file is not an RGB24 raw picture." if ( (-s $inputfile) %3 != 0);
open (my $fh,$inputfile);
binmode $fh;

my $colordetected = 0;

for (my $i=0;$i< -s $inputfile;$i+=3){
    my ($R,$G,$B);
    read ($fh,$R,1);
    $R = ord($R);
    read ($fh,$B,1);
    $B = ord($B);
    read ($fh,$G,1);
    $G = ord($G);
     if ( $R >= $B-$fuzz  and  $R <= $B+$fuzz and  $B >= $G-$fuzz and  $B <= $G+$fuzz )  {
       #this pixel seems gray
     }else{
        $colordetected ++,
     } 
}

if ($colordetected != 0){
    print "There seem to be colors in this image"
}