将 T* 数组(喷射* 或浮点*)转换为 cv::Mat<CV_32f>
convert T* array (Jet* or float*) to cv::Mat<CV_32f>
我正在使用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)重写所需的单义分解
相关文章:
- Difference in displaying cv2 Mat
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 将CHW格式的浮点向量转换为cv::Mat
- C++中的openCV Mat访问冲突
- OpenCV 和从 OutputArrays 或 (Mat) 读取数据
- 使用 mat.at<uchar>(i,j) 的 opencv C++中的矩阵赋值错误
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 将 cv::mat 转换为 QImage
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 将 cv::Mat 转换为 std::vector 的通用函数
- 如何通过引用传递OpenCV MAT
- 在 QML VideoOutput 中将 cv::mat 显示为 QVideoFrame
- Read OpenCV Mat 16bit to QImage 8bit Greyscale
- 将本地 OpenCV Mat 变量声明为静态以防止重新分配
- 将 OpenCv Mat 从 C++ 传递给 Python