преобразовать массив T * (Jet * или float *) в cv :: Mat & lt; CV_32f & gt;

Я использую 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 , Как я могу это сделать?

0

Решение

Вы не можете использовать метод 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) переписать нужную гомографию разложения

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]