javascript – 每帧的视频中的主色

我想分析一个LED闪烁的视频(mp4).

背景通常是灰色的,但LED的颜色可能会有所不同.

LED在视频中足够接近,因此LED灯是框架的最大部分.

我找到了Color-Thief但它只是用于图像而不是用于视频.

因为闪烁的频率也可能不同,我需要检查视频的每一帧是否为主色.

如果有人有任何想法,我会非常感谢一些帮助.在此先感谢您的时间.

编辑:
视频的两个屏幕截图(第一个红色LED关闭;第二个红色LED亮起)(必须删除两个屏幕截图链接的颜色窃贼链接)

这是在视频开始播放时调用的功能,应分析视频.我尝试通过平均颜色来做,但这没用,因为它通常是某种灰色/棕色.

function processFrame(e) {  

    var video = document.getElementById("video");

    if (video.ended){
        //dauer();
        console.log("Ende");
        //alert("Ende");
    }

    if (video.paused || video.ended) {
        return;
    }

    var bufferCanvas = document.getElementById("buffer");
    var displayCanvas = document.getElementById("display");
    var buffer = bufferCanvas.getContext("2d");
    var display = displayCanvas.getContext("2d");

    buffer.drawImage(video, 0,0, bufferCanvas.width, displayCanvas.height);

    var frame = buffer.getImageData(sx, sy, sw, sh);
    var length = frame.data.length / 4;

    for (var i = 0; i < length; i++) {
        var r = frame.data[i * 4 + 0];
        var g = frame.data[i * 4 + 1];
        var b = frame.data[i * 4 + 2];
        average= average +((r+g+b)/3)       
    }   

    averagecolor[i]=average

    display.putImageData(frame, 0, 0);

    setTimeout(processFrame, 0);
}

最佳答案 您需要在几个步骤中执行此操作,这有点宽泛 – 但完全可以做到.为了缩短,我将只介绍您需要采取的步骤,以便能够分析LED.

您可以完全自动或半自动地预定义视频帧中的区域.

自动检测的步骤如下,如果移动相机或更改变焦,则每个会话使用一次.照明条件也会影响检测,但在这里我将假设照明条件与您显示的图像相同.它也特定于这些图像,如果更改路由器/摄像机的设置,可能无法正常工作.

自动检测区域的初始步骤:

>当所有RGB值= 255(这是LED的白色中心)时,扫描水平线到中途并开始注册区域.设置一个区域中的标志,并根据阈值开始注册时计算像素数(例如,连续需要白色的7-10个像素).这是为了消除白色的单个像素.
>当您在一行(基于阈值)结束区域找不到任何白色像素并准备新注册时.
>当在上半部分的底部(我将设置最大高度短于实际高度)时,从中间到右边缘重新开始扫描.

在此之后,您应该注册六个区域(使用“校准”框架,其中所有LED都点亮 – 这可以在运行之前手动运行).

对于下一步将是不断运行的步骤,您将使用这些区域作为锚区域,并且仅在一侧采样点并且仅在高度上采样几个像素.

>将区域用作锚点,并基于具有区域2像素的偏移x宽度作为起始X的区域定义样本区域(这只是初始偏移的建议 – 您可能需要对此进行微调).偏移Y 10并将宽度和高度设置为10像素.这应该会给你一个100点的样本区域,紧邻led.
>使用getImageData在此小区域上运行统计信息.您需要检查所有三个组件,以便过滤掉浅灰色.找到一个阈值(例如,如果r> 230& b< 200&& g< 200只是为了取一些值),当你踢你积累你的红色值(和另一个为绿色).此过程需要校准阶段才能找到您需要使用的阈值.运行一些测试.如果相机改变f-stop,您可能需要重新校准.
>将绿色和红色值累加到不同的变量.您不需要对它们进行平均,但是您需要找到总和的阈值,您知道LED的LED被点亮了该颜色(使用区域检测的初始测试帧也是如此).通过比较LED关闭时的区域,为这些值添加一些容差.

如果您可以对其进行微调,这将为您提供总共只有600点扫描可能更少.

对于手动方法,您可以跳过区域设置,如第一步所述,但使用框架并通过测量白色顶部的像素手动设置区域.如果您更改摄像机位置,则需要完成此操作.

如您所知,有一些代码需要为此编写,并且有许多因素会影响最终代码,使其非常具体.而且我认为它部分超出了SO的范围,但我希望这会给你一些线索让你前进.

点赞