Mat通道引发的bug

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

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

我们来试试

报错的代码如下:

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 [ 10*10*CV_8UC1, 恍然大悟

打印截图capImg.getMat()

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


可以看到 Mat [ 1920*1080*CV_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文档, 最后才是群里问问

--- 牙叔教程


声明

部分内容来自网络

本教程仅用于学习, 禁止用于其他用途

相关文章
|
计算机视觉
OpenCV-通道合并cv::merge
OpenCV-通道合并cv::merge
171 0
|
计算机视觉
StretchDIBits 直接使用cv::Mat的数据有可能显示错误的问题
StretchDIBits 直接使用cv::Mat的数据有可能显示错误的问题
|
计算机视觉 容器
OpenCV-通道分离cv::split
OpenCV-通道分离cv::split
|
7月前
|
计算机视觉 Python
OpenCV中拆分通道、合并通道、alpha通道的讲解及实战演示(附python源码 超详细)
OpenCV中拆分通道、合并通道、alpha通道的讲解及实战演示(附python源码 超详细)
432 0
|
2月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
534 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
算法 数据可视化
Halcon边缘检测和线条检测(3),文章含BLOB检测常用方法和shape_trans内接和外接算子的说明
Halcon边缘检测和线条检测(3),文章含BLOB检测常用方法和shape_trans内接和外接算子的说明
2215 0
Halcon边缘检测和线条检测(3),文章含BLOB检测常用方法和shape_trans内接和外接算子的说明
|
6月前
|
Java 计算机视觉
Canny边缘检测高低阈值连接的代码修正
Canny边缘检测高低阈值连接的代码修正
36 0
|
算法 计算机视觉
OpenCV-自适应阈值函数cv::adaptiveThreshold
OpenCV-自适应阈值函数cv::adaptiveThreshold
127 0
OpenCV-自适应阈值函数cv::adaptiveThreshold
|
计算机视觉
OpenCV-尺寸调整cv::resize
OpenCV-尺寸调整cv::resize
|
存储 计算机视觉 C++
【OpenCv】c++ 入门认识 Mat 类,单通道 Mat 的基本操作
【OpenCv】c++ 入门认识 Mat 类,单通道 Mat 的基本操作
327 0