opencv 中的简单矩阵乘法失败
Simple Matrix multiplication in opencv fails
我执行以下操作
Mat xOld,xNew;
for(uint i=0;i<inliers.size();i++){
if(inliers[i]){
double xOld_arr[3]={kpOld[i].pt.x,kpOld[i].pt.y,1};
double xNew_arr[3]={kpNew[i].pt.x,kpNew[i].pt.y,1};
Mat xo(1,3,CV_64FC1,xOld_arr),xn(1,3,CV_64FC1,xNew_arr);
xNew.push_back(xn);
xOld.push_back(xo);
}
}
xNew=xNew.t();
cout<<F.size()<<" "<<xNew.size();
Mat t=xNew*F;
输出为
[3 x 3] [24 x 3]OpenCV Error: Assertion failed (a_size.width == len) in gemm, file /home/flex/test/opencv/modules/core/src/matmul.cpp, line 1537
terminate called after throwing an instance of 'cv::Exception'
what(): /home/flex/test/opencv/modules/core/src/matmul.cpp:1537: error: (-215) a_size.width == len in function gemm
我错过了什么?当我乘以矩阵时,它不应该是正确的。因为 xNew 有相同的列和 F 相同的行?
F是什么类型的?
所以 F 是 3 行,3 列。 xNew(转置后)是 3 行,24 列。现在您尝试乘以(矩阵表示法:行 x 列)3x24 * 3x3 未定义。矩阵乘法是大小:N x M * M x O => NxO 矩阵。所以如果你不转置你应该能够将两个矩阵相乘,但我不能告诉你这是否是你想要的乘法。
也许混淆是在这一行:xn(1,3,CV_64FC1,xNew_arr)
这里你创建了一个 1 行 3 列的矩阵,然后将这一行添加到 xNew。
我执行以下操作
Mat xOld,xNew;
for(uint i=0;i<inliers.size();i++){
if(inliers[i]){
double xOld_arr[3]={kpOld[i].pt.x,kpOld[i].pt.y,1};
double xNew_arr[3]={kpNew[i].pt.x,kpNew[i].pt.y,1};
Mat xo(1,3,CV_64FC1,xOld_arr),xn(1,3,CV_64FC1,xNew_arr);
xNew.push_back(xn);
xOld.push_back(xo);
}
}
xNew=xNew.t();
cout<<F.size()<<" "<<xNew.size();
Mat t=xNew*F;
输出为
[3 x 3] [24 x 3]OpenCV Error: Assertion failed (a_size.width == len) in gemm, file /home/flex/test/opencv/modules/core/src/matmul.cpp, line 1537
terminate called after throwing an instance of 'cv::Exception'
what(): /home/flex/test/opencv/modules/core/src/matmul.cpp:1537: error: (-215) a_size.width == len in function gemm
我错过了什么?当我乘以矩阵时,它不应该是正确的。因为 xNew 有相同的列和 F 相同的行?
F是什么类型的?
所以 F 是 3 行,3 列。 xNew(转置后)是 3 行,24 列。现在您尝试乘以(矩阵表示法:行 x 列)3x24 * 3x3 未定义。矩阵乘法是大小:N x M * M x O => NxO 矩阵。所以如果你不转置你应该能够将两个矩阵相乘,但我不能告诉你这是否是你想要的乘法。
也许混淆是在这一行:xn(1,3,CV_64FC1,xNew_arr)
这里你创建了一个 1 行 3 列的矩阵,然后将这一行添加到 xNew。