2015-10-22 14 views
0

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

+0

кстати, резюме :: У Mat нет оператора [] – berak

+0

Можете ли вы создать функцию с этим прототипом? float getFromJetAt (Jet * Kparams, int pos). Предполагается, что эта функция получит значение в позиции pos из этого Jet. И вам не нужно беспокоиться о возможности его размещения в этой функции. –

ответ

2

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

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

1) Использование численного дифференцирования: см http://ceres-solver.org/nnls_tutorial.html#numeric-derivatives

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