javascript - 如何获得开/关序列间隔之间的时间?
问题描述
我有点业余编码,所以我会尽我所能解释我的问题:
我正在尝试创建一个莫尔斯电码光解码器,输入是闪烁的莫尔斯电码序列的视频,输出是解码的短语。
到目前为止,我得到了一个变量,当灯亮时为真,当灯熄灭时为假。这是我到目前为止的视频:
演示视频
如果您想编辑它,这是我的程序:
莫尔斯解码器
这是我用于测试的视频:
测试
我正在寻找的是以某种方式将左上角的波动变量转换为如下所示的内容:
[{"state":"on", "lengthtime":"300ms"}, {"state":"off", "lengthtime":"200ms"}, {"state":"on", "lengthtime":"400ms"}, ...]
此列表按顺序列出每个脉冲/暂停,以及每个脉冲/暂停的长度。这将很容易解析并转换为莫尔斯。
我检查它是否打开或关闭的代码:
function drawFrame(video) {
let onoff = 0;
context.drawImage(video, 0, 0);
var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
grayscaleVid(imageData.data);
context.putImageData(imageData, 0, 0);
var pixel = context.getImageData(112, 64, 1, 1);
var data = pixel.data;
const brightness = (data[0] + data[1] + data[2]) / 3;
if (brightness > 130) {
onoff = true;
} else {
onoff = false;
}
document.getElementById('test').innerHTML = onoff;
setTimeout(function() {
drawFrame(video);
}, 10);
}
解决方案
设置一些具有历史和先前状态的全局存储:
const history = [];
let wasOn = False;
调整亮度检测记录到history
const isOn = brightness > 130;
if (wasOn != isOn) {
history.push({
state: wasOn,
timestamp: performance.now(),
});
wasOn = isOn;
}
然后,完成后,处理结果:
const results = history.map((v,i,a) => {
if (!i) return {state: v.state, duration: 0};
return {state: v.state, duration: v.timestamp - a[i-1].timestamp};
});
推荐阅读
- python-3.x - python3如何读取csv,计算数字并写入csv?
- python - 使用scrapy从静态地图中获取纬度
- javascript - Javascript 创建和引用 cookie?
- python - 从滑块中绘制 Matplotlib (Python) 中的复杂函数?
- java - 编程新手遇到问题
- android - TextView 作为 Kotlin 中的进度条
- javascript - 如何从 GitHub 获取 API 数组的所有“项目”?
- datatables - 输入字段的数据表 onchange 事件
- c# - 如何统一保存场景之间的浮动
- html - 动态垂直对齐复选框