2015-10-22 106 views
0

我正在使用ceres-solver和AutoDiffCostFunction。我的成本函數作爲參數1x3向量並輸出1x1殘差。 如何創建我的T *參數向量中的opencv Mat?它可能是Jet或浮動。 我嘗試下面的代碼,但得到錯誤「無法從噴氣CONVER浮動」將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

順便說一句,CV :: Mat沒有[]運算符 – berak

+0

您是否可以使用此原型創建函數? float getFromJetAt(Jet * Kparams,int pos)。該函數應該從Jet中獲得位置pos的值。而且你不必擔心它在該函數中浮動的可能性。 –

回答

2

以這種方式您不能在ceres :: AutoDiffCostFunction中使用OpenCV方法。 OpenCV方法不是根據ceres進行自動微分所需的類型T進行模板化。由於雅各布人的ceres射流是矢量而不是標量,因此無法完成浮法。

你有兩個選擇:

1)使用數值微分:看http://ceres-solver.org/nnls_tutorial.html#numeric-derivatives

2)使用模板庫(如本徵http://eigen.tuxfamily.org/index.php?title=Main_Page)改寫所需的單應分解