美文网首页
Mat通道引发的bug

Mat通道引发的bug

作者: 牙叔教程 | 来源:发表于2021-09-26 19:09 被阅读0次

    群里有个新人, 说以下代码报错, 越界了, 看不出来咋回事,
    我们来试试
    报错的代码如下:

    function requestCapture() {
      threads.start(function () {
        let beginBtn;
        if (beginBtn = classNameContains("Button").textContains("立即开始").findOne(2000)) {
          beginBtn.click();
        }
      });
      if (!requestScreenCapture()) {
        toast("请求截图失败");
        return false;
      }
      return true;
    }
    requestCapture();
    for (var i = 0; i < 0; i++) { sleep(1000); log(i); }
    function main() {
      let capImg = captureScreen();
      let srcImg = images.clip(capImg, 0, 0, 10, 10);
    
      for (let m = 0; m < 2; m++) {
        let grayImg = images.grayscale(srcImg);
        let thresImg = images.threshold(grayImg, 66, 200);
        grayImg.recycle();
        let width = thresImg.getWidth();
        let height = thresImg.getHeight();
        for (let i = 1; i < height; i += 3) {
          for (let j = 1; j < width; j += 3) {
            let number = images.pixel(thresImg, j, i);
            let color = colors.toString(number);
            console.log(color);
          }
        }
        thresImg.recycle();
      }
      srcImg.recycle();
      capImg.recycle();
    }
    main();
    

    F5运行后的报错日志

    09-13 21:59:36.711 Script-10 Main [remote://tmp.js]/V: 开始运行[remote://tmp.js] 
    09-13 21:59:36.982 Script-10 Main [remote://tmp.js]/E: Wrapped java.lang.ArrayIndexOutOfBoundsException: length=1; index=3
        at main (remote://tmp.js:28:0)
        at remote://tmp.js:38:0
     
    09-13 21:59:36.982 Script-10 Main [remote://tmp.js]/V: 
    ------------
    [remote://tmp.js]运行结束,用时0.269000秒 
    

    第28行报错, 内容是

    let number = images.pixel(thresImg, j, i);
    

    排查bug过程

    一开始怀疑 i, j 有问题, 把代码改为

    let number = images.pixel(thresImg, 1, 1);
    

    报错还是一模一样, 那就不是 i, j 的问题了

    那就看看thresImg是什么

    Image{width=10, height=10, bitmap=[LateInit], mat=Mat [ 10*10*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0xffffffffa7406e00, dataAddr=0xffffffffa1dbaf80 ], mediaImage=null} 
    

    看到这个 mat=Mat [ 1010CV_8UC1, **恍然大悟


    打印截图capImg.getMat()

    Mat [ 1920*1080*CV_8UC4, isCont=true, isSubmat=false, nativeObj=0xffffffffa1f1b680, dataAddr=0xffffffff9d340000 ] 
    

    可以看到 Mat [ 19201080CV_8UC4**


    文档说明
    images.pixel(image, x, y) 返回图片image在点(x, y)处的像素的ARGB值。
    argb对应的就是C4, 4个维度
    thresImg二值化图只有0-255, 也就是1个维度, 对应的是CV_8UC1里面的C1


    到这里就明了了
    Wrapped java.lang.ArrayIndexOutOfBoundsException: length=1; index=3
    length = 1 对应的是 二值化的1个维度
    index = 3 对应的是png图片的4个维度

    名人名言

    思路是最重要的, 其他的百度, bing, stackoverflow, 安卓文档, autojs文档, 最后才是群里问问
    --- 牙叔教程

    声明

    部分内容来自网络
    本教程仅用于学习, 禁止用于其他用途

    相关文章

      网友评论

          本文标题:Mat通道引发的bug

          本文链接:https://www.haomeiwen.com/subject/hnjqgltx.html