Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 常数T*常数点到特征矩阵_C++_Eigen - Fatal编程技术网

C++ 常数T*常数点到特征矩阵

C++ 常数T*常数点到特征矩阵,c++,eigen,C++,Eigen,在再次添加其余代码之后 给出了以下错误。不确定它是否与本征矩阵有关,或者说束调整器不喜欢我使用本征矩阵 class CostFunction { public: CostFunction() : num_residuals_(0) {} virtual ~CostFunction() {} Error 2 Error C2039:'epsilon':不是'Eigen::NumTraits'c:\dev\Eigen-Eigen-ffa86ffb5570\Eigen\src\Core\

在再次添加其余代码之后

给出了以下错误。不确定它是否与本征矩阵有关,或者说束调整器不喜欢我使用本征矩阵

class CostFunction {
 public:
  CostFunction() : num_residuals_(0) {}

  virtual ~CostFunction() {}
Error 2 Error C2039:'epsilon':不是'Eigen::NumTraits'c:\dev\Eigen-Eigen-ffa86ffb5570\Eigen\src\Core\IO.h 132 1 simple\u bundle\u调节器的成员
操作符()
类成员函数吗?不能在类之外定义它。下面的代码编译

Error   2   error C2039: 'epsilon' : is not a member of 'Eigen::NumTraits<ceres::Jet<T,12>>'    c:\dev\eigen-eigen-ffa86ffb5570\eigen\src\Core\IO.h 132 1   simple_bundle_adjuster

Eigen::Map
用于包装C样式数组,以便将其用作
Eigen::Matrix
。通常,这允许它甚至可以写入底层数组。由于您只有一个
T常量*
,因此不允许写入。为了保持常量正确,您需要告诉Eigen映射不允许写入,因为您只有
T常量*
指针。为此,请指定
映射到
常量矩阵

template <typename T> class MyClass{...};
模板
布尔运算符()(常数T*常数摄影机,
常数T*常数点,
T*残差)常数{
//VVV
特征::矩阵rot=特征::映射<常数特征::矩阵>(摄像机);

std::cout我认为您将需要更新版本的Ceres。请在git repo中签出该版本

epsilon()被添加到


它比1.8.0版本晚。

更新了完整的代码示例,因为正在进行其他正确的操作。
ceres::CostFunction
是类型吗?如果是,请在前面添加关键字
typename
,如
typename ceres::CostFunction*
我应该只更改成本函数,(operator())ye这是一个类,将尝试TypeName问题出在您的
静态ceres::CostFunction*创建中(const double observed_x,const double observed_y)
函数,如果您删除它,它将编译。您得到了什么错误?是
rot
应该是
矩阵
还是
映射
?复制初始化操作左右两侧的类型(
=
)不匹配。@Ben Voigt:FYI
Map
是一个特征模板,它用访问器函数包装了一个C型数组,因此它可以用作模板参数的矩阵类型。这包括能够将其用作副本赋值/构造函数的源。请注意,它看起来像是OP试图估计旋转,并通过esti来实现匹配3x3旋转矩阵的9个条目。这通常不是最好的主意,因为问题公式高度参数化。最好使用四元数或角度轴表示,并优化这3个或4个参数。它们唯一定义旋转,如果需要,您可以轻松计算旋转矩阵d一个。但它给了我一个关于丢失ε的新错误,我可以扩展eigen使捆绑调整器的ε工作吗有趣的是,只有当有//std::cout时错误才在那里谢谢你的输入。我编译了它,可能不需要更新的版本。如果我试图在成本函数中使用std::cout,它只会抱怨它丢失了在上。不知道为什么。当我们知道1.8版本是否可用时,可能会采用更高版本。
Error   2   error C2039: 'epsilon' : is not a member of 'Eigen::NumTraits<ceres::Jet<T,12>>'    c:\dev\eigen-eigen-ffa86ffb5570\eigen\src\Core\IO.h 132 1   simple_bundle_adjuster
class MyClass{
public:
template <typename T>
bool operator()(const T* const camera,
    const T* const point,
    T* residuals) const 
    {
        Eigen::Matrix<T, 3, 3, Eigen::RowMajor> rot = Eigen::Map <Eigen::Matrix< T, 3, 3,     Eigen::RowMajor> >(camera);
        std::cout << rot << std::endl;
        // must return true or false, as you declare `bool` as the return type
        return true;
    }
};
template <typename T> class MyClass{...};
template <typename T>
bool operator()(const T* const camera,
    const T* const point,
    T* residuals) const {

                                                          //   vvvvv
    Eigen::Matrix<T, 3, 3, Eigen::RowMajor> rot = Eigen::Map < const Eigen::Matrix< T, 3, 3, Eigen::RowMajor> >(camera);
    std::cout << rot << std::endl;                            
}