2016-09-17 49 views
-1

我做了以下简单的矩阵乘法失败

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相同的行?

回答

1

F是什么类型?

所以F是3行3列。 x新(转置后)是3行,24列。现在您尝试将未定义的(矩阵表示法:行x列)3x24 * 3x3相乘。矩阵乘法的大小为:N x M * M x O => NxO矩阵。所以,如果你不转置,你应该能够乘以这两个矩阵,但我不能告诉你这是否是你想要的乘法。

也许这一行中有这样的混淆:xn(1,3,CV_64FC1,xNew_arr)这里你创建一个有1行和3列的矩阵,然后把这行添加到xNew中。

+0

感谢您的答案,但我转置xNew与xNew = xNew.t()之前。但我也尝试过没有移调,我没有工作。只是为了确定我不会错过某事。 F也是CV_64FC1 –

+0

好吧,我的糟糕的地方还有其他的错误。 –