You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多层嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 23:55:25