Я использую Ceres-Solver с AutoDiffCostFunction. Моя функция стоимости берет в качестве параметра 1×3 вектор и выводит 1×1 остаток.
Как я могу создать 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
, Как я могу это сделать?
Вы не можете использовать метод OpenCV в ceres :: AutoDiffCostFunction таким образом. Метод OpenCV не шаблонизируется с типом T, как того требует ceres для автоматического дифференцирования. Наложение поплавка не может быть выполнено, потому что струя Якобиана является вектором, а не скаляром.
У вас есть два варианта:
1) Используйте числовое дифференцирование: см. http://ceres-solver.org/nnls_tutorial.html#numeric-derivatives
2) Используйте шаблонную библиотеку (например, Eigen http://eigen.tuxfamily.org/index.php?title=Main_Page) переписать нужную гомографию разложения
Других решений пока нет …