копирование элементов из матрицы opencv в собственную матрицу - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть std :: vector, заполненный 3x3 матрицами opencv. Я хочу развернуть матрицы и записать их в 9xn eigen :: matrix.

std::vector<cv::Mat1d> cvMatrix;

// some code that generates a std::vector with 3880 cv matrices, the cv matrices have the size 3x3

Eigen::Matrix<double, Eigen::Dynamic, 9> eigenMatrix;
for (int i = 0; i < curvatures.size(); i++) {
    eigenMatrix.resize(i + 1, 9);
    for (int j = 0; j < 9; j++) {
        eigenMatrix(i, j) = cvMatrix[i](j / 3, j % 3);
    }
}

Если я проверяю элементы сразу после их записи (например, печать значений eigenMatrix, если i == 10), то все, кажется, будет найдено, но после того, как цикл for закончен, он больше не удерживается,Кажется, что большинство элементов в eigenMatrix содержат нули. Кто-нибудь может объяснить, что здесь происходит?

1 Ответ

2 голосов
/ 04 ноября 2019

eigenMatrix.resize(i + 1, 9); уничтожает содержимое eigenMatrix. Поскольку вы уже знаете окончательное измерение в начале, просто напишите

Eigen::Matrix<double, Eigen::Dynamic, 9> eigenMatrix;
eigenMatrix.resize(curvatures.size(), 9);

или даже просто

Eigen::Matrix<double, Eigen::Dynamic, 9> eigenMatrix(curvatures.size(), 9);

перед запуском цикла for.

Если вам нужночтобы изменить размер матрицы, но сохранить содержимое, вы можете использовать conservativeResize() - но этого следует избегать, поскольку для каждого изменения размера требуется полная копия.

...