[英]How to get time between intervals of an on/off sequence?
我有點業余編碼員,所以我會盡我所能解釋我的問題:
我正在嘗試創建一個莫爾斯電碼光解碼器,輸入是閃爍的莫爾斯電碼序列的視頻,輸出是解碼后的短語。
到目前為止,我得到了一個變量,當燈亮時為真,燈滅時為假。 這是我到目前為止所擁有的視頻:
演示視頻
如果你想編輯它,這是我的程序:
莫爾斯解碼器
這是我用於測試的視頻:
測試
我正在尋找的是以某種方式將左上角的波動變量轉換為如下所示的內容:
[{"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};
});
好的,你需要做的是,創建一個定時器,每次狀態由開變為關,反之亦然,創建一個新的寄存器。
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;
...
}
這段代碼不是很漂亮,但我只是保持你使用的標准
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.