Я использую ceres-solver с функцией AutoDiffCostFunction. Моя функция стоимости принимает в качестве параметра 1x3 вектор и выводит 1x1. Как я могу создать opencv Mat из моего вектора параметров T *? Это может быть либо Jet, либо float. Я попытался следующий код, но получаю ошибку «не может CONVER от Jet плавать»конвертировать T * array (Jet * или float *) в cv :: Mat <CV_32f>
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
. Как я могу это сделать?
кстати, резюме :: У Mat нет оператора [] – berak
Можете ли вы создать функцию с этим прототипом? float getFromJetAt (Jet * Kparams, int pos). Предполагается, что эта функция получит значение в позиции pos из этого Jet. И вам не нужно беспокоиться о возможности его размещения в этой функции. –