2016-09-17 18 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は同じ列と同じ行を持ちますか?

答えて

1

どのタイプが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に追加します。

+0

答えをありがとうが、xNew = xNew.t()でxNewを転記します。しかし、私は転調せずにもやってみたし、うまくいきませんでした。ちょうど私がsthを見逃していないことを確認する。 F is is CV_64FC1 –

+0

私の悪いところには別のエラーがありました。 –

関連する問題