将 T* 数组(喷射* 或浮点*)转换为 cv::Mat<CV_32f>

convert T* array (Jet* or float*) to cv::Mat<CV_32f>

本文关键字:lt Mat CV gt 32f cv 转换 喷射 数组      更新时间:2023-10-16

我正在使用AutoDiffCostFunction的ceres-solver。我的代价函数取1x3向量作为参数,输出1x1残差。我如何创建opencv Mat出我的T*参数向量?它可以是喷射式的,也可以是浮动式的。我尝试以下代码,但得到错误"无法从Jet转换为float"

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。我该怎么做呢?

不能以这种方式在ceres::AutoDiffCostFunction中使用OpenCV方法。OpenCV方法没有按照ceres要求的T类型模板化,以进行自动区分。不能进行浮点型强制转换,因为雅可比矩阵的ceres射流是矢量而不是标量。

你有两个选择:

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

2)使用模板化库(例如Eigen http://eigen.tuxfamily.org/index.php?title=Main_Page)重写所需的单义分解