问题标签 [ceres-solver]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
211 浏览

c++ - How do I use ceres::CubicInterpolator with data not on a uniform grid

Ceres solver allows interpolation with a piecewise cubic hermite interpolant, which I'm trying to use to create a cubic interpolant for Eigen.

This snippet from ceres/examples shows how to set up an interpolator. Adapting it to provide a toy example for my use case:

Which I believe can be evaluated at a location between the given data points like:

But the Grid1D object has no concept of what the x values are. It always assumes the data is on a regular grid, starting at some index (in this case 0) and containing kNumSamples (in this case 4) samples.

The Question

How can I make Grid1D aware of the actual input x locations? Alternatively, what mapping should I be doing to my x_interp values to get the right answer out?

Thanks for any help!

0 投票
1 回答
366 浏览

optimization - 在 ceres-solver 中约束多摄像机捆绑调整的内在参数

我有一组 6 个视频剪辑,由车顶的 6 个摄像头拍摄。我正在尝试使用 CERES 来捆绑调整这 6 台摄像机的 O(1.4K) 帧。据推测,这 6 个摄像机中的每一个的内在参数都是恒定的,非常接近。因此,我试图找出一种合理的方式将这种物理约束纳入 CERES 的框架中。

作为 CERES 新手,我尝试搜索以前的捆绑调整示例和问题。但令人惊讶的是,我还没有找到 CERES 求解器代码示例,其中相机内在函数由于对应于少量物理相机而受到限制。

从 simple_bundle_adjuster.cc 示例代码开始,我首先尝试在 BALProblem 类的 double* parameters_ 成员中分离外部、内部和 3D 点变量。我希望可以为具有不同外部和 3D 点参数但根据摄像机的物理 ID 共享内部参数的视频帧构建单独的 ResidualBlocks。

这是我对 simple_bundle_adjuster.cc 示例中的 Create() 方法稍作修改的版本:

不幸的是,我无法找到任何方法来分享与 CERES 一致的 6 个物理摄像机的共同内在参数。

Q1:CERES 是否需要将所有外在参数和内在参数 + 3D 点组合到每个物理摄像机的一个大残差块中?鉴于在编译时通常不知道摄像机收集的帧数,这是否可能?

Q2:每个物理摄像机的内在参数的恒定性是否可以通过上/下参数界限来近似强制执行?也许一些收紧参数限制的迭代方法可能会奏效。

0 投票
1 回答
273 浏览

c++ - Ceres Solver:对非线性最小二乘使用平滑近似

我们正在使用 Google ceres 求解器来解决计算机视觉应用程序中出现的优化问题。我们使用AutoDiffCostFunction来评估残差,密集 QR 求解器能够优化函数并找到一个合适的最小值。但我想知道使用 fmax、fmin 和 relu(或残差内的 if/else)等非平滑函数是否被认为是一种不好的做法。

我们的残差包含一些非平滑操作:

另一个在零处不可微的片段:

例如,我们可以用平滑近似替换 fmax:

问题是我们是否应该系统地去除任何不平滑的残差,即使密集的 QR 按预期工作?

0 投票
1 回答
565 浏览

c++ - 在 centOS7 上安装 ceres-solver 并让 helloworld.cc 工作

问题:我想使用 Google 的ceres-solverC++ 库,但无法在其网页helloworld.cc上运行该示例。

安装:我正在使用(全新安装)CentOS7,并按照ceres-solver 网站上的安装说明进行操作。替换apt-getwith yum-equivalent 包,我安装了以下内容:

  • 对于g++编译器,gcc使用安装sudo yum install "Development Tools"
  • cmake有了这些说明
  • 几个图书馆sudo yum install glog-devel atlas-devel gflags-devel eigen3-devel suitesparse-devel blas-devel lapack-devel
  • 在一个新文件夹中,我下载了 tar.gz 文件

其次是网页上的linux指令ceres,即

终端输出:上面代码的简要输出如下。如果提供更多详细信息,我可以粘贴完整的日志。

  1. 运行cmake
  1. 运行后的尾部输出make install

g++ 错误:当我尝试helloworld.cc使用以下命令运行文件时

然后我收到以下错误:

我看到该错误与此问题类似,但尚未收到令人满意的答案。任何帮助,将不胜感激。

0 投票
1 回答
708 浏览

android - 如何修复 CERES_USE_OPENMP、CERES_USE_CXX11_THREADS 或 CERES_NO_THREADS 中的错误之一必须在 Ceres Solver Android 中定义

我正在将 Ceres Solver Library 集成到我的 Android 应用程序中。我在 Android Studio 中使用 CMakeLists.txt 为所有架构创建了预构建的共享库(.so 文件)。现在我想用 OpenCV java 包装器在 Java/Kotlin 中实现 Bundle 调整。

要在 Android 应用程序中使用 Ceres Solver,我们必须使用 Ceres Solver 及其依赖库的 .so 文件和头文件在 C++ 中编写 ceres Solver 逻辑。然后我们必须将包装器写入我们自己的方法以在 Java / Kotlin 中使用。

为此,我使用以下 CMakeLists.txt 文件

使用 Ceres Solver 类和方法的示例 C++ 文件 native-lib.cpp

当我构建应用程序时,我收到以下错误。

我是 NDK、Cmake 和 Ceres Solver 的新手,所以我不知道如何解决这个问题。有人请建议我如何解决问题或指出我做错了什么。提前致谢。

0 投票
0 回答
454 浏览

c++ - 我可以使用 ceres 求解器来拟合动态创建的曲线吗?

我需要将数据拟合到用户选择的曲线作为预定义函数的总和。这个想法是创建类似于peak-o-mat对光谱数据所做的事情。

示例:将一些数据拟合为一个函数,该函数是一个线性函数(两个参数)和一个柯西函数(两个参数)之和。

如果我在编译时知道,我要拟合的曲线是线性和柯西的总和,我可以为此创建一个特定的残差。但问题是我只在运行时知道它。

我想做的是:

1)根据我向用户公开的功能列表定义残差:

2)ceres::Problem根据用户选择的功能组合解决添加残差块。

我在想两种选择:

a) 创建一个曲线拟合类,其成员具有所有选定的函数和每个函数的参数数组。然后我会在这个类中创建一个 Residual,它有xy作为参数,但是会循环遍历这些函数和参数,返回它们的输出之和。问题是我无法使用以下方法添加残差块:

<Residual, 1, 1, 1>因为我只会在运行时知道的模板参数(最多有 9 个)。

所以我一直在寻找一个不同的选择,我可以分别添加每个残差。我尝试了一个带有线性和柯西(洛伦兹)残差的简单示例,但它不起作用。

我检查了文档,但我没有找到任何关于结合不同功能的曲线拟合的内容。

有谁知道如何使它工作?

0 投票
1 回答
818 浏览

c++ - 使用 Ceres 求解器进行 CMake 项目时的 Eigen 依赖项冲突

我安装ceres-solver使用

brew install ceres-solver

在 macOS 上。

CMake.txt我为使用 Ceres 的客户项目创建了一个。

但是,当我运行以下命令时

cmake . -Bbuild

我收到以下错误

如何删除 Eigen 的冲突版本?我不记得我过去是如何安装它的。我也尝试过运行brew uninstall Eigen,但这并没有使错误消失。

谢谢你的帮助。

0 投票
1 回答
1451 浏览

mathematical-optimization - 何时在 Ceres 中定义多个 Residual 块?

我正在阅读 Ceres Solver教程

鲍威尔函数

Powell 函数映射自,因此定义一个接收 4 元素数组并填充 4元素数组的残差块R^4 -> R^4似乎很直观。xresidual

相反,教程中的示例定义了映射 4 个不同的残差块R^2 -> R^1

当然,如果我们试图最小化1/2 || F(x) ||^2,那么最小化 的每个元素F将隐含地产生与直接最小化相同的解决方案1/2 || F(x) ||^2(即,我的建议是返回单个残差向量F而不是F1......F4单独)。(我已经使用下面的成本函子验证了这一点)。

  1. 为残差向量的每个元素定义单独的残差块(和隐式参数块)有什么好处F

  2. 如果残差F1取决于参数x1并且x2残差F2取决于x3和,则相对于x4的成本会影响 的值吗?Fx1x3

曲线拟合

另一个示例尝试查找参数mc曲线y=e^(mx + c)

它定义了一些简单地ExponentialResidual输出数据点的位置。T(y_) - exp(m[0] * T(x_) + c[0])(x_, y_)

然后他们继续为每个观察添加一个残差块

  1. 虽然我懒得自己重现这个例子,但我怀疑这也可以用一个映射的残差块来完成R^2 -> R^1,其中一维残差只是所有的T(y_) - exp(m[0] * T(x_) + c[0])总和(x_, y_)?是否有必要为每个观察定义一个残差块?

感谢您阅读这篇长文!

0 投票
1 回答
162 浏览

android - 为什么使用 NDK 不能存在不同的 stl 实现?

我尝试基于两个开源库构建一个项目。我使用的库是 OpenCV 和 ceres。libopencv_java3.so 是来自网站 github 的 OpenCV3.1.2 版本,其中包括 OpenCV-3.1.0-android-sdk。libceres.so 是我自己从源代码编译而来的。

当我构建我的应用程序时,NDK-build 会生成以下信息:

clang++.exe:警告:编译期间未使用的参数:'-nostdlib++' [-Wunused-command-line-argument]

错误:未定义对 'cv::imwrite(cv::String const&, cv::_InputArray const&, std::__ndk1::vector > const&)' 的引用

谷歌搜索后,我找到了一篇相关帖子

Error Undefined reference to 'std::__ndk1::locale::~locale()' 答案说使用了不同的 STL 实现。

就我而言,libopencv_java.so 可能使用 gnustl_static 而 libceres 使用 c++_static。我不明白原因。这两个实现都是静态库,不应该发生冲突。

  1. 来自 opencv 版本的所有文件都是用 gnustl_static 编译的吗?
  2. 为什么 __ndk1 出现在 std::vector 中?
  3. 对于一个大型项目,不同的工程师承担不同的子任务。他们应该链接一个常见的 stl 实现吗?静态联动和动态联动的要求不同吗?
0 投票
1 回答
301 浏览

ceres-solver - 类中目标函数的 ceres 求解器的实现

我是 Ceres 的初学者(已经研究了不到一周),并且正在尝试使用 ceres 求解器来求解我在课堂上的成本函数。以下是我的代码示例版本,我无法为 ceres 设置成本函数。

该过程应如下所示:我有一个包含 14 个参数的数组 initparam[14],它必须在 myStruct 的 operator() 中输入到我的类中。

当我尝试访问运算符中的 initparam 时,每个元素都不是双精度,而是 ceres Jet。

从我从其他一些博客文章中可以看到,我可能必须实现 ceres 文档( http://ceres-solver.org/interfacing_with_autodiff.html)中提到的这类东西。不幸的是,我对谷神星的了解有限,不确定这是否真的是正确的方法。有人可以帮我吗?如果需要,我很乐意提供更多信息