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

OpenCV Java 3.4.4 Core.gemm()断言失败错误求助

OpenCV Java 3.4.4 Core.gemm() 矩阵乘法断言错误解决

错误信息

OpenCV(3.4.4) Error: Assertion failed (type == B.type()) in void cv::gemm(cv::InputArray, cv::InputArray, double, cv::InputArray, double, cv::OutputArray, int), file /build/3_4-contrib_pack-contrib-android/opencv/modules/core/src/matmul.cpp, line 1558

问题代码

Mat A = new Mat(); //接收3*3矩阵
Mat A1 = new Mat();
Core.invert(A,A1); //将矩阵A求逆得到A1
Mat B = new Mat(); //接收1*3矩阵
Mat C = new Mat(); //接收1*3矩阵
Mat D = new Mat(); //接收3*3矩阵
Mat D1 = new Mat();
Core.invert(D,D1); //将矩阵D求逆得到D1
Mat E = new Mat(); //接收3*3矩阵
Mat dest1 = new Mat();
Mat dest2 = new Mat();
Mat dest3 = new Mat();
Mat my_answer = new Mat(); //结果应为1*3或3*1矩阵
Core.gemm(E,C,1,Dummy_Null,0,dest1); //乘法函数,Dummy_Null是我定义的3*3零矩阵
Core.gemm(dest1.t(),D1,1,Dummy_Null,0,dest2); //乘法函数
Core.subtract(dest2,B,dest3);
Core.gemm(A1,dest3,1,Dummy_Null,0,my_answer);//<------错误发生在此行
//将my_answer打印到日志//

使用数据类型:CvType.CV_64F

错误原因

这个断言错误的核心是gemm函数的两个输入矩阵(A1和dest3)数据类型不匹配。虽然你声明整体使用CV_64F,但以下场景可能导致类型变化:

  • 矩阵初始化时未显式指定类型,空构造函数创建的Mat可能默认不是CV_64F;
  • Core.subtract操作可能因输入矩阵的隐式转换,导致输出dest3的类型改变;
  • 中间步骤的矩阵转置、乘法操作可能意外改变数据类型。

另外附带提醒:你代码中Core.gemm(E,C,1,Dummy_Null,0,dest1)存在矩阵维度不匹配问题——33的E和13的C无法直接做矩阵乘法(前一个矩阵的列数必须等于后一个的行数),要么是C的实际维度是3*1,要么需要给gemm传入转置标志调整,否则这一步本身就会报错,可能你注释里的矩阵维度描述有误。

解决方案

  1. 显式初始化所有矩阵为CV_64F类型
    创建矩阵时不要使用空构造函数,明确指定维度和类型:
Mat A = new Mat(3, 3, CvType.CV_64F);
Mat B = new Mat(1, 3, CvType.CV_64F);
Mat C = new Mat(3, 1, CvType.CV_64F); // 根据乘法需求调整维度
Mat D = new Mat(3, 3, CvType.CV_64F);
Mat E = new Mat(3, 3, CvType.CV_64F);
Mat Dummy_Null = new Mat(3, 3, CvType.CV_64F, Scalar.all(0));
  1. 强制转换dest3的类型为CV_64F
    在调用最后一步gemm前,确保dest3和A1类型一致:
Core.subtract(dest2,B,dest3);
// 转换dest3的类型为CV_64F
dest3.convertTo(dest3, CvType.CV_64F);
Core.gemm(A1,dest3,1,Dummy_Null,0,my_answer);
  1. 检查矩阵维度匹配
    确认每一步gemm的矩阵维度符合乘法规则:
  • 最后一步中,A1是33,dest3必须是3N(比如31),这样相乘后得到3N的结果,符合你期望的3*1输出;
  • 调整Core.gemm(E,C,1,Dummy_Null,0,dest1)的参数,比如添加转置标志让C转置:
Core.gemm(E,C,1,Dummy_Null,0,dest1, Core.GEMM_2_T); // 转置C为3*1,实现E(3*3)*C^T(3*1)=dest1(3*1)

内容的提问来源于stack exchange,提问作者Im-wakeup

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:35:13