检测视频是否黑白



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

我已经提取了一个框架:

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

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

我从来没有发现为什么视频处理问题在 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在灰色时具有相同的值,但实际上您需要允许一些更模糊的匹配,例如,如果所有值都相同+-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"
}

最新更新