我正在编写一个由黑白方块组成的图形代码(就像一个简化的QRcode)。在HTML画布中,我能够检测到每个正方形的位置和像素。问题是计算每个正方形区域中有多少黑色像素。
假设我的代码是5x3正方形。我为每一行创建了一个数组:row_1 = [0,0,0,0,0];
像素是黑色还是白色?
for (let i = 0, j = pix.length; i < j; i += 4) {
if(pix[i+0] + pix[i+1] + pix[i+2] < 30) { /* add 1 to array */ }
}一旦扫描完方块,数组应该看起来像row_1 = [20,1580,0,1250,40];,表示第一个、第三个和第五个方块是白色的,第二个、第四个是黑色的。
最终值应为0(白色)和1600 (40x40),但手机摄像头捕获的代码可能不是完全水平/垂直的。
我尝试了不同的解决方案,但都不起作用:
// first square is [0]
if(pix[i+0] + pix[i+1] + pix[i+2] < 30) { row_1[0] +=1 }
if(pix[i+0] + pix[i+1] + pix[i+2] < 30) { row_1[0] = row_1[0]+1 }
if(pix[i+0] + pix[i+1] + pix[i+2] < 30) { row_1[0].splice(0, 1, row_1[0]+1) }如何做到这一点?提前谢谢。
*编辑
我的第一个想法(效果很好)是定义一个变量,而不是数组let row_1_1 = 0,然后对于每个黑色像素:if(...black pix...){ row_1_1 +=1 },它工作得很好,但1)我必须手动创建很多变量,2)使用一个数组,我可以循环整个函数。使用var意味着使用自己的var单独探索每个方块。使用数组意味着只需一行代码就可以浏览所有的行方块。
发布于 2019-12-11 21:45:21
它起作用了。
let row_1 = [ 0,0,0,0,0 ];
let imgctx = ctx.getImageData(0, 0, cameraCanvas.width, cameraCanvas.height);
let pix = imgctx.data;
for (let i = 0, j = pix.length; i < j; i += 4) {
if( ... condition to detect the 1st row in canvas... ) {
for (let c = 0, l = 5; c < l; c ++) { // loop for 5 squares
if( ...condition for each square: left and width... ) {
if(pix[i+0] + pix[i+1] + pix[i+2] < 30) { row_1[c] +=1; }
}
}
}
}
alert("1st row = "+row_1) // -> [0,1552,53,1492,112]然后循环数组,Math.round((1552/1600)*100)得到每个正方形中黑色像素的百分比= 97%。正方形是黑色的。
https://stackoverflow.com/questions/59284853
复制相似问题