首页 > 解决方案 > 如何获得开/关序列间隔之间的时间?

问题描述

我有点业余编码,所以我会尽我所能解释我的问题:

我正在尝试创建一个莫尔斯电码光解码器,输入是闪烁的莫尔斯电码序列的视频,输出是解码的短语。

到目前为止,我得到了一个变量,当灯亮时为真,当灯熄灭时为假。这是我到目前为止的视频:
演示视频
如果您想编辑它,这是我的程序:
莫尔斯解码器
这是我用于测试的视频:
测试

我正在寻找的是以某种方式将左上角的波动变量转换为如下所示的内容:

[{"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);
}

标签: javascripthtmlvariableshtml5-canvasmorse-code

解决方案


设置一些具有历史和先前状态的全局存储:

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};
});

推荐阅读