我想在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);
}
答案 0 :(得分:2)
你需要在几个步骤中执行此操作,这有点宽泛 - 但完全可以做到。为了缩短,我将只介绍您需要采取的步骤,以便能够分析LED。
您可以全自动或半自动地预定义视频帧中的区域。
自动检测的步骤如下所示,如果移动相机或更改变焦,则每次使用一次。照明条件也会影响检测,但在这里我将假设照明条件与您显示的图像相同。它也特定于这些图像,如果更改路由器/摄像机的设置,则可能无法正常工作。
自动检测区域的初始步骤:
在此之后,您应该注册六个区域(使用“校准”框架,其中所有LED都点亮 - 这可以在运行之前手动运行。)
对于下一步将是不断运行的步骤,您将使用这些区域作为锚区域,并且仅在一侧采样点,仅在高度上采样几个像素。
if r > 230 && b < 200 && g < 200
只是为了取一些值)当你踢你积累你的红色值(和另一个为绿色)。此过程需要校准阶段才能找到您需要使用的阈值。运行一些测试。如果相机改变f-stop,您可能需要重新校准。如果您可以对其进行微调,这将使您总共只能扫描600个点。
对于手动方法,您可以跳过区域设置,如第一步所述,但使用框架并通过测量白色顶部的像素手动设置区域。如果您更改相机位置,则需要完成此操作。
正如您所理解的那样,需要为此编写一些代码,并且有许多因素会影响最终代码,使其非常适合此用法。而且我认为它部分超出了SO的范围,但我希望这能为您提供一些帮助您前进的方法。