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传入转置标志调整,否则这一步本身就会报错,可能你注释里的矩阵维度描述有误。
解决方案
- 显式初始化所有矩阵为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));
- 强制转换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);
- 检查矩阵维度匹配
确认每一步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
相关产品推荐
相关产品推荐

