Простое умножение матриц в opencv не удается

Я делаю следующее

    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 столбца. xNew (после транспонирования) - 3 строки, 24 столбца. Теперь вы пытаетесь умножить (матричная запись: строки x столбцы) 3x24 * 3x3, который не определен. Матрица умножения имеет размер: N x M * M x O => NxO матрица. Так что вы должны быть в состоянии умножить обе матрицы, если не транспонируете, но я не могу сказать вам, хотите ли вы это умножение.

Возможно путаница в этой строке: xn(1,3,CV_64FC1,xNew_arr) здесь вы создаете матрицу с 1 строкой и 3 столбцами, а затем добавляете эту строку в xNew.

Другие вопросы по тегам