React Native安卓项目切换OpenCV 4.5.4后调用Canny算子出现断言错误求助
错误原因
你遇到的OpenCV断言报错,是因为调用Canny算子时重载匹配异常:OpenCV 4.x存在两种Canny重载,一种接收8位常规图像作为输入,另一种接收预先计算的16位有符号Sobel梯度(CV_16SC1/CV_16SC3)作为输入。你代码中的写法触发了错误的重载匹配,核心原因有两个:
- Canny调用时输入输出复用了同一个
srcGray对象,就地操作导致Mat类型被意外修改 srcGray在循环中被多次复用修改,下一次循环调用Canny时输入数据类型不符合要求
修复方案
步骤1:修改Canny调用逻辑,避免就地复用Mat
将getPoints函数中Canny相关的代码替换为以下写法,使用临时Mat存储边缘结果,避免输入输出复用:
for (int t=10; t<=60; t+=10) { // 新建临时边缘Mat,类型固定为8位单通道 Mat edgeMat = new Mat(srcGray.size(), CvType.CV_8UC1); Imgproc.Canny(srcGray, edgeMat, t, t*2,5,false); Imgproc.dilate(edgeMat, edgeMat, new Mat(), new Point(-1, -1), 2); findCannySquares(edgeMat,cannySquares,c+t); // 用完释放内存,避免泄漏 edgeMat.release(); }
步骤2:每次循环迭代重置灰度图
你当前的srcGray仅在shapeDetection中初始化一次,后续循环中会被二值化、边缘检测操作修改,导致后续循环输入数据错误。在通道循环的开头新增灰度重置逻辑:
for (int c = 0; c < 3; c++) { // 每次循环都用原始彩色图重新生成灰度图,避免前一次循环修改残留 Imgproc.cvtColor(outerMat, srcGray, Imgproc.COLOR_RGB2GRAY,4); // 原有代码不变 int[] ch = {c, 0}; MatOfInt cmat = new MatOfInt(ch); // ... 剩下的原有逻辑 }
额外检查
你报错日志中显示的OpenCV版本为4.0.1,和你描述的4.5.4版本不符,请检查项目gradle依赖,确认已完全替换旧版本OpenCV依赖,避免版本冲突。
内容的提问来源于stack exchange,提问作者Ambesh Tiwari
相关产品推荐
相关产品推荐

