1.问题
OpenCV在做Mat矩阵运算的时候报如下错误:
error: (-215:Assertion failed) type == B.type() in function 'gemm'
如下代码就会报此错误:
cv::Mat A(3,3,CV_32F);
cv::Mat B(3,3,CV_64F);
std::cout << A*B << std::endl;
2.原因
主要是因为两个做运算的矩阵数据类型不统一,更细致一点儿说,cv::Mat A(3,3,CV_32F)
定义的矩阵A
在提取数据时使用的是指向32位float类型的指针,而B
是64位,此时32位的指针取B
中的数据时就会报错。
3.解决办法
可以将矩阵定义为相同类型再做运算,或者强制转换成相同的类型再做运算:
cv::Mat A(3,3,CV_64F);
cv::Mat B(3,3,CV_64F);
std::cout << A*B << std::endl;
//或者
cv::Mat A(3,3,CV_32F);
cv::Mat B(3,3,CV_64F);
A.convertTo(A, CV_64F);
std::cout << A*B << std::endl;
4.另外可能出现的情况
cv::Mat fundamental_matrix = cv::findFundamentalMat(point_curr, point_last);
cv::findFundamentalMat()
函数在64位系统中的返回值是CV_64F
的Mat,如果和CV_32F
的Mat运算也会报如上错误。
像这样的细节,在OpenCV中常出现,一旦出错极难发现,值得关注一下!