我有一个包含数百个电影的文件夹,我想将彩色电影与黑白电影分开。是否有bash命令可以对常规视频文件执行此操作?
我已经提取了一个帧:
ffmpeg -ss 00:15:00 -i vid.mp4 -t 1 -r 1/1 image.bmp
如何检查图像是否具有颜色成分?
答案 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"
}