【问题标题】:Simple Matrix multiplication in opencv failsopencv中的简单矩阵乘法失败
【发布时间】:2016-09-17 07:13:00
【问题描述】:

我做以下事情

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

【问题讨论】:

    标签: opencv matrix matrix-multiplication


    【解决方案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。

    【讨论】:

    • 感谢您的回答,但我之前用 xNew=xNew.t() 转置了 xNew。但我也尝试过不转置,但我没有工作。只是为了确保我不会错过某事。 F也是CV_64FC1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    相关资源
    最近更新 更多