微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ceres求解器参数个数问题

如何解决Ceres求解器参数个数问题

我写了一个这样的函子:

class Functor
{
...
    static CostFunction* create()
    {
        return new autodiffCostFunction<Functor,N_RES,N_ParaMS>(new Functor()); 
    }
...
}

我称之为:

std::vector<double> params(N_ParaMS,0);
CostFunction* costFunc = Functor::create();
problem.AddResidualBlock(costFunc,nullptr,params.data());

奇怪的是,这在 N_ParaMS=236 时不起作用,但适用于 6237(我试过)。错误消息是段错误。 而且我之前用过Ceres Solver,从来没有遇到过这样的问题。

Ceres Solver 的参数个数有限制吗?

==========================================更新==== ============== 我是这样写的:

class ReprojError {
public:            
    ReprojError(
        const std::vector<std::vector<Eigen::Vector3d>>& pt2d,const std::vector<Eigen::Matrix<double,3,4>>& vmProjs) : 
        m_pt2d(pt2d),m_vmProjs(vmProjs) { }
    
    template<typename _Tp>
    bool operator () (const _TP* const pts,_TP* aResiduals) const 
    {
        for(int i = 0; i < 24; ++i)
        {
            std::cout << "?" << std::endl;
            if(m_pt2d[i].empty())
            {
                for(int j = 0; j < 276; ++j)
                {
                    aResiduals[i * 276 * 2 + j * 2] = _Tp(0);
                    aResiduals[i * 276 * 2 + j * 2 + 1] = _Tp(0);
                }
            }
            else
            {
                auto proj = m_vmProjs[i];
                 for(int j = 0; j < 276; ++j)
                {
                    auto X = pts[j * 3];
                    auto Y = pts[j * 3 + 1];
                    auto Z = pts[j * 3 + 2];

                    auto newX = (_Tp)proj(0,0) * X + (_Tp)proj(0,1) * Y + (_Tp)proj(0,2) * Z + (_Tp)proj(0,3);
                    auto newY = (_Tp)proj(1,0) * X + (_Tp)proj(1,1) * Y + (_Tp)proj(1,2) * Z + (_Tp)proj(1,3);
                    auto newZ = (_Tp)proj(2,0) * X + (_Tp)proj(2,1) * Y + (_Tp)proj(2,2) * Z + (_Tp)proj(2,3);
                    
                    aResiduals[i * 276 * 2 + j * 2] = newX / newZ - m_pt2d[i][j](0);
                    aResiduals[i * 276 * 2 + j * 2 + 1] = newY / newZ - m_pt2d[i][j](1);
                }               
            }
        }

        return true;
    }

    static ceres::CostFunction* create(
        const std::vector<std::vector<Eigen::Vector3d>>& pt2d,4>>& vmProjs) 
    {
        return (new ceres::autodiffCostFunction<ReprojError,24 * 2 * 276,276 * 3>(
            new ReprojError(pt2d,vmProjs)));
    }

private:
    const std::vector<std::vector<Eigen::Vector3d>>& m_pt2d;
    const std::vector<Eigen::Matrix<double,4>>& m_vmProjs;

public:
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};

并已定义:

EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Eigen::Vector3d)
EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Eigen::Matrix<double,4>)

还有'?'没有输出,这意味着没有执行operator()。

解决方法

没有这样的参数限制。在调试模式下编译代码以查看发生了什么会很有帮助。

也就是说,为什么要将所有这些放在一个成本函数中,为什么不为每个观察值设置一个成本函数?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?