Преобразовать массив T* (Jet* или float*) в cv::Mat<CV_32f>

Я использую Ceres-Solver с AutoDiffCostFunction. Моя функция стоимости берет в качестве параметра 1x3 вектор и выводит 1x1 остаток. Как я могу создать OpenCV Mat из моего вектора параметров T*? Это может быть либо Jet, либо float. Я попробовал следующий код, но получаю ошибку "не могу конвертировать из Jet, чтобы плавать"

struct ErrorFunc
{
    template <typename T>
    bool operator()(const T * const Kparams, T * residual) const // Kparams - [f, u, v]
    {
        cv::Mat K = cv::Mat::eye(3, 3, CV_32F);
        K.at<float>(0, 0) = float(Kparams[0]); // error
        K.at<float>(0, 2) = float(Kparams[1]); // error
        K.at<float>(1, 1) = float(Kparams[0]); // error
        K.at<float>(1, 2) = float(Kparams[2]); // error

        Mat Hdot = K.inv() * H * K;

        cv::decomposeHomographyMat(Hdot, K, rot, tr, norm); //want to call this opencv function

        residual[0] = calcResidual(norm);
        return true;
    }
    Mat H;
}

Есть способ получить собственную матрицу из матрицы T*:

const Eigen::Matrix< T, 3, 3, Eigen::RowMajor> hom = Eigen::Map< const Eigen::Matrix< T, 3, 3, Eigen::RowMajor> >(Matrix)

но я хочу позвонить cv::decomposeHomographyMat, Как я могу это сделать?

1 ответ

Решение

Вы не можете использовать метод OpenCV в ceres::AutoDiffCostFunction таким образом. Метод OpenCV не шаблонизируется с типом T, как того требует ceres для автоматического дифференцирования. Наложение поплавка не может быть сделано, потому что струя Якобиана является вектором, а не скаляром.

У вас есть два варианта:

1) Используйте числовое дифференцирование: см. http://ceres-solver.org/nnls_tutorial.html

2) Используйте шаблонную библиотеку (например, Eigen http://eigen.tuxfamily.org/index.php?title=Main_Page), чтобы переписать требуемую декомпозицию гомографии

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