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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:45:03