Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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
检测bash中的视频是否为黑白_Bash_Video - Fatal编程技术网

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

检测bash中的视频是否为黑白,bash,video,Bash,Video,我有一个文件夹,里面有几百部电影,我想把彩色电影和黑白电影分开。是否有bash命令可以对常规视频文件执行此操作 我已经提取了一个帧: ffmpeg-ss 00:15:00-i vid.mp4-t1-r 1/1 image.bmp 如何检查图像是否有颜色成分?我一直不知道为什么视频处理问题会这样回答,但由于它们通常不会关闭,我会尽全力。。。由于这是一个开发板,我不能推荐任何现成的命令行工具用于bash命令,我也不知道任何工具。我也不能给出一个只有bash的解决方案,因为我不知道如何在bash中处理

我有一个文件夹,里面有几百部电影,我想把彩色电影和黑白电影分开。是否有bash命令可以对常规视频文件执行此操作

我已经提取了一个帧:

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


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

我一直不知道为什么视频处理问题会这样回答,但由于它们通常不会关闭,我会尽全力。。。由于这是一个开发板,我不能推荐任何现成的命令行工具用于bash命令,我也不知道任何工具。我也不能给出一个只有bash的解决方案,因为我不知道如何在bash中处理二进制数据

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

首先,我会调整图像的大小以节省处理能力,例如,将图像调整到4x4像素。另外,请确保已知颜色空间或更好的pix_格式,以便了解像素的外观

使用此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颜色。要检查所有像素是否为灰色,您需要比较RG和B之间的差异。通常,RG和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"
}
使用严格;
使用警告;
我的$fuzz=10;
my$inputfile=“d:\\out\u grey.raw”;
die“输入文件不是RGB24原始图片。”如果(-s$inputfile)%3!=0);
打开(我的$fh,$inputfile);
binmode$fh;
我的$colordetected=0;
对于(我的$i=0;$i<-s$inputfile;$i+=3){
我的($R,$G,$B);
读取($fh,$R,1);
$R=作战需求文件($R);
读($fh,$B,1);
$B=作战需求文件($B);
读取($fh,$G,1);
$G=作战需求文件($G);

如果($R>=$B-$fuzz和$R=$G-$fuzz和$B我从来都不知道为什么视频处理问题会在如此短的时间内得到回答,但由于这些问题通常都没有解决,我会尽我最大的努力…因为这是一个开发板,我不能推荐任何现成的命令行工具用于您的bash命令,我也不知道任何工具。我也不能给出一个只有bash的解决方案,因为我不知道如何在bash中处理二进制数据

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

首先,我会调整图像的大小以节省处理能力,例如,将图像调整到4x4像素。同时,请确保已知颜色空间或更好的pix_格式,以便了解像素的外观

使用此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"
}
使用严格;
使用警告;
我的$fuzz=10;
my$inputfile=“d:\\out\u grey.raw”;
die“输入文件不是RGB24原始图片。”如果(-s$inputfile)%3!=0);
打开(我的$fh,$inputfile);
binmode$fh;
我的$colordetected=0;
对于(我的$i=0;$i<-s$inputfile;$i+=3){
我的($R,$G,$B);
读取($fh,$R,1);
$R=作战需求文件($R);
读($fh,$B,1);
$B=作战需求文件($B);
读取($fh,$G,1);
$G=作战需求文件($G);

如果($R>=$B-$fuzz和$R=$G-$fuzz和$B使用。好的,我可以使用ffmpeg获得一个帧,但是它如何检查它是否是黑白的呢?您拥有的单个帧可能是偶然的黑白。并不是因为您的电影是黑白的,所以颜色级别设置为灰度。此外,除了某些帧之外,有些电影是黑白的(辛德勒名单,艺术家,…)Martin先生,我的答案怎么了?谢谢Harry,它能用。好吧,我可以用ffmpeg来获得一个帧,但是它怎么能检查它是否是黑白的呢?你拥有的单帧可能是黑白的。并不是因为你的电影是黑白的,所以颜色级别设置为灰度。此外,有些电影是BW的,除了一些帧(辛德勒名单,艺术家,…)马丁先生,我的答案怎么了?谢谢,哈利,它行得通