多层嵌套for循环故障排查:图像40×40同色块识别失败
嵌套循环定位图像中40×40纯色区域问题
编辑:大幅修改了早期版本
我陷入了嵌套for循环的死胡同。
代码功能:扫描图像,寻找内部所有像素颜色近似一致的40×40像素方块。
问题:代码未按预期运行,多次调试都没解决。
jimp.read('jeffrey.png') .then(image => { console.log(jimp.intToRGBA(image.getPixelColor(0,0))) console.log(image.bitmap.width) console.log(image.bitmap.height) var breakAll = false; var FINALX; var FINALY; var doneCounter = 0; //40 by 40 pixels needed for qr code. Thisis barcode, so make it 40 by 80 or smthn, figure out that x thing. for(var x = 0; x < image.bitmap.width; x++) { var breakThis = false; console.log(x + " is x") if(breakAll == true) { break; } var verticalStart = 0; for(var y1 = verticalStart; y1 < image.bitmap.height; y1++) { if(breakAll == true) { break; } var tempStandardR = jimp.intToRGBA(image.getPixelColor(x,y1)).r; var tempStandardG = jimp.intToRGBA(image.getPixelColor(x,y1)).g; var tempStandardB = jimp.intToRGBA(image.getPixelColor(x,y1)).b; var verticalCounter = 0; for(var y2 = y1; y2 < image.bitmap.height; y2++) { if(breakAll == true) { break; } if(verticalCounter >= 40) { //Then do X stuff //horizcountertim for(var y3 = y1; y3 < y1 + 40; y3++) { if(breakAll == true) { break; } breakThis = false; var horizontalCounter = 0; var tempStandardR3 = jimp.intToRGBA(image.getPixelColor(x,y3)).r; var tempStandardG3 = jimp.intToRGBA(image.getPixelColor(x,y3)).g; var tempStandardB3 = jimp.intToRGBA(image.getPixelColor(x,y3)).b; for(var x2 = x; x2 < x + 41; x2++) { if(breakAll == true) { break; } console.log(doneCounter) if(doneCounter >= 40) { //SUCESS!!!!!! //THE SPOT HAS BEEN FOUND AT (x minus 40, y minus 40). //insert other image in this image at above coordinates. Wow I highly doubt this works. console.log('SUCESS!!!!!!!!!') FINALX = x2-40; FINALY = y3-40; breakAll = true; break; } if(breakAll == true) { break; } var tempStandardR4 = jimp.intToRGBA(image.getPixelColor(x2,y3)).r; var tempStandardG4 = jimp.intToRGBA(image.getPixelColor(x2,y3)).g; var tempStandardB4 = jimp.intToRGBA(image.getPixelColor(x2,y3)).b; if((((tempStandardR3 - tempStandardR4) <= 20) && ((tempStandardR3 - tempStandardR4) >= -20)) && (((tempStandardG3 - tempStandardG4) <= 20) && ((tempStandardG3 - tempStandardG4) >= -20)) && (((tempStandardB3 - tempStandardB4) <= 20) && ((tempStandardB3 - tempStandardB4) >= -20))) { horizontalCounter++; if(horizontalCounter == 40) { horizontalCounter = 0; doneCounter++; break; } // if((x2 - x >= 39) && (y3 - y1) >= 39) { if(breakAll == true) { break; } } else { horizontalCounter = 0; verticalCounter = 0; doneCounter = 0; console.log('donecounter reset') verticalStart = y3; //y2 = y3; breakThis = true; break; } } if(breakAll == true) { break; } if(breakThis = true) { break; } } if(breakThis = true) { breakThis = false; break; } } if(breakAll == true) { break; } var tempStandardR2 = jimp.intToRGBA(image.getPixelColor(x,y2)).r; var tempStandardG2 = jimp.intToRGBA(image.getPixelColor(x,y2)).g; var tempStandardB2 = jimp.intToRGBA(image.getPixelColor(x,y2)).b; if((((tempStandardR - tempStandardR2) <= 20) && ((tempStandardR - tempStandardR2) >= -20)) && (((tempStandardG - tempStandardG2) <= 20) && ((tempStandardG - tempStandardG2) >= -20)) && (((tempStandardB - tempStandardB2) <= 20) && ((tempStandardB - tempStandardB2) >= -20))) { verticalCounter++; } else { verticalCounter = 0; verticalStart = y2; console.log('lvl1 reset') doneCounter = 0; break; } } } } console.log(' done'); console.log(FINALX + " = x") console.log(FINALY + " = y") }) .catch(err => { console.log(err); })
所有tempStandard变量代表对应像素的RGB值,嵌套for循环用于定位40×40的区域。
我发现的一个异常点是doneCounter:它本应在每行水平检测通过后自增,但控制台输出中会重复显示同一数值,这不符合逻辑,因为它处于一个有if-else分支的循环中,要么自增要么重置为0。
编辑:我废弃了上述代码并完全重写,问题仍未解决,毫无头绪,以下是更新后的代码:
jimp.read('jeffrey.png') .then(image => { console.log(jimp.intToRGBA(image.getPixelColor(0,0))) console.log(image.bitmap.width) console.log(image.bitmap.height) var breakAll = false; var FINALX; var FINALY; var doneCounter = 0; var veritcalCounter = 0; var verticalStart = 0; var horizontalCounter = 0; var breakAll = false; var breakThis = false; //40 by 40 pixels needed for qr code. Thisis barcode, so make it 40 by 80 or smthn, figure out that x thing. for(var x = 0; x < image.bitmap.width; x++) { console.log(x) verticalCounter = 0; for(var y = 0; y < image.bitmap.height; y++) { var tempStandardR = jimp.intToRGBA(image.getPixelColor(x,verticalStart)).r; var tempStandardG = jimp.intToRGBA(image.getPixelColor(x,verticalStart)).g; var tempStandardB = jimp.intToRGBA(image.getPixelColor(x,verticalStart)).b; var tempStandardR2 = jimp.intToRGBA(image.getPixelColor(x,y)).r; var tempStandardG2 = jimp.intToRGBA(image.getPixelColor(x,y)).g; var tempStandardB2 = jimp.intToRGBA(image.getPixelColor(x,y)).b; if((((tempStandardR - tempStandardR2) <= 20) && ((tempStandardR - tempStandardR2) >= -20)) && (((tempStandardG - tempStandardG2) <= 20) && ((tempStandardG - tempStandardG2) >= -20)) && (((tempStandardB - tempStandardB2) <= 20) && ((tempStandardB - tempStandardB2) >= -20))) { verticalCounter++; if(verticalCounter == 40) { verticalCounter = 0; for(var y1 = y-40; y1 < y; y1++) { horizontalCounter = 0; for(var x1 = x; x1 < x+41; x1++) { var tempStandardR3 = jimp.intToRGBA(image.getPixelColor(x,y1)).r; var tempStandardG3 = jimp.intToRGBA(image.getPixelColor(x,y1)).g; var tempStandardB3 = jimp.intToRGBA(image.getPixelColor(x1,y1)).b; var tempStandardR4 = jimp.intToRGBA(image.getPixelColor(x1,y1)).r; var tempStandardG4 = jimp.intToRGBA(image.getPixelColor(x1,y1)).g; var tempStandardB4 = jimp.intToRGBA(image.getPixelColor(x1,y1)).b; if((((tempStandardR3 - tempStandardR4) <= 20) && ((tempStandardR3 - tempStandardR4) >= -20)) && (((tempStandardG3 - tempStandardG4) <= 20) && ((tempStandardG3 - tempStandardG4) >= -20)) && (((tempStandardB3 - tempStandardB4) <= 20) && ((tempStandardB3 - tempStandardB4) >= -20))) { if(x1 == x+40) { doneCounter++; if(doneCounter == 39) { //SUCESS!!!!!! //THE SPOT HAS BEEN FOUND AT (x minus 40, y minus 40). //insert other image in this image at above coordinates. Wow I highly doubt this works. console.log('SUCESS!!!!!!!!!') FINALX = x; FINALY = y1-40; breakAll = true; break; } break; } } else { verticalCounter = 0; horizontalCounter = 0; doneCounter = 0; y = y1; breakThis = true; break; } if(breakAll == true) { break; } } if(breakThis == true) { breakThis = false; break; } if(breakAll == true) { break; } } if(breakAll == true) { break; } } if(breakAll == true) { break; } } else { verticalCounter = 0; verticalStart = 0; } if(breakAll == true) { break; } } if(breakAll == true) { break; } } console.log(' done'); console.log(FINALX + " = x") console.log(FINALY + " = y") }) .catch(err => { console.log(err); })
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

