如何解决如何获得开/关序列间隔之间的时间?
我有点业余编码员,所以我会尽我所能解释我的问题:
我正在尝试创建一个莫尔斯电码光解码器,输入是一个闪烁的莫尔斯电码序列的视频,输出是解码的短语。
到目前为止,我得到了一个变量,当灯亮时为真,灯灭时为假。
这是我目前所拥有的视频:
Demo Video
如果你想编辑它,这是我的程序:
Morse Decoder
这是我用于测试的视频:
Test
我正在寻找的是以某种方式将左上角的波动变量转换为如下所示的内容:
[{"state":"on","lengthtime":"300ms"},{"state":"off","lengthtime":"200ms"},{"state":"on","lengthtime":"400ms"},...]
这个列表是按顺序排列的每个脉冲/暂停,以及每个脉冲/暂停的长度。这将很容易解析并转换为莫尔斯。
function drawFrame(video) {
let onoff = 0;
context.drawImage(video,0);
var imageData = context.getimageData(0,canvas.width,canvas.height);
grayscaleVid(imageData.data);
context.putimageData(imageData,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};
});
,
好的,你需要做的是,创建一个定时器,每次状态从开启变为关闭,反之亦然,创建一个新的寄存器。
let registers = []
;
let currTime = Date.now();
let onoff = false;
function drawFrame(){
...
let newOnoff;
if (brightness > 130) {
newOnoff = true;
} else {
newOnoff = false;
}
if (newOnoff !== onoff) {
const state = onoff === true ? 'on' : 'off';
const newTime = Date.now();
registers.push({state,lengthtime : (newTime - currTime) + 'ms' });
currTime = newTime;
}
onoff = newOnoff;
document.getElementById('test').innerHTML = onoff;
...
}
这段代码不是很漂亮,但我只是保持你使用的标准
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。