Преобразовать массив 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), чтобы переписать требуемую декомпозицию гомографии