问题标签 [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.
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!
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:每个物理摄像机的内在参数的恒定性是否可以通过上/下参数界限来近似强制执行?也许一些收紧参数限制的迭代方法可能会奏效。
c++ - Ceres Solver:对非线性最小二乘使用平滑近似
我们正在使用 Google ceres 求解器来解决计算机视觉应用程序中出现的优化问题。我们使用AutoDiffCostFunction来评估残差,密集 QR 求解器能够优化函数并找到一个合适的最小值。但我想知道使用 fmax、fmin 和 relu(或残差内的 if/else)等非平滑函数是否被认为是一种不好的做法。
我们的残差包含一些非平滑操作:
另一个在零处不可微的片段:
例如,我们可以用平滑近似替换 fmax:
问题是我们是否应该系统地去除任何不平滑的残差,即使密集的 QR 按预期工作?
c++ - 在 centOS7 上安装 ceres-solver 并让 helloworld.cc 工作
问题:我想使用 Google 的ceres-solver
C++ 库,但无法在其网页helloworld.cc
上运行该示例。
安装:我正在使用(全新安装)CentOS7,并按照ceres-solver
网站上的安装说明进行操作。替换apt-get
with 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
,即
终端输出:上面代码的简要输出如下。如果提供更多详细信息,我可以粘贴完整的日志。
- 运行
cmake
:
- 运行后的尾部输出
make install
:
g++ 错误:当我尝试helloworld.cc
使用以下命令运行文件时
然后我收到以下错误:
我看到该错误与此问题类似,但尚未收到令人满意的答案。任何帮助,将不胜感激。
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 的新手,所以我不知道如何解决这个问题。有人请建议我如何解决问题或指出我做错了什么。提前致谢。
c++ - 我可以使用 ceres 求解器来拟合动态创建的曲线吗?
我需要将数据拟合到用户选择的曲线作为预定义函数的总和。这个想法是创建类似于peak-o-mat对光谱数据所做的事情。
示例:将一些数据拟合为一个函数,该函数是一个线性函数(两个参数)和一个柯西函数(两个参数)之和。
如果我在编译时知道,我要拟合的曲线是线性和柯西的总和,我可以为此创建一个特定的残差。但问题是我只在运行时知道它。
我想做的是:
1)根据我向用户公开的功能列表定义残差:
2)ceres::Problem
根据用户选择的功能组合解决添加残差块。
我在想两种选择:
a) 创建一个曲线拟合类,其成员具有所有选定的函数和每个函数的参数数组。然后我会在这个类中创建一个 Residual,它有x
和y
作为参数,但是会循环遍历这些函数和参数,返回它们的输出之和。问题是我无法使用以下方法添加残差块:
<Residual, 1, 1, 1>
因为我只会在运行时知道的模板参数(最多有 9 个)。
所以我一直在寻找一个不同的选择,我可以分别添加每个残差。我尝试了一个带有线性和柯西(洛伦兹)残差的简单示例,但它不起作用。
我检查了文档,但我没有找到任何关于结合不同功能的曲线拟合的内容。
有谁知道如何使它工作?
c++ - 使用 Ceres 求解器进行 CMake 项目时的 Eigen 依赖项冲突
我安装ceres-solver
使用
brew install ceres-solver
在 macOS 上。
CMake.txt
我为使用 Ceres 的客户项目创建了一个。
但是,当我运行以下命令时
cmake . -Bbuild
我收到以下错误
如何删除 Eigen 的冲突版本?我不记得我过去是如何安装它的。我也尝试过运行brew uninstall Eigen
,但这并没有使错误消失。
谢谢你的帮助。
mathematical-optimization - 何时在 Ceres 中定义多个 Residual 块?
我正在阅读 Ceres Solver教程。
鲍威尔函数
Powell 函数映射自,因此定义一个接收 4 元素数组并填充 4元素数组的残差块R^4 -> R^4
似乎很直观。x
residual
相反,教程中的示例定义了映射 4 个不同的残差块R^2 -> R^1
。
当然,如果我们试图最小化1/2 || F(x) ||^2
,那么最小化 的每个元素F
将隐含地产生与直接最小化相同的解决方案1/2 || F(x) ||^2
(即,我的建议是返回单个残差向量F
而不是F1
......F4
单独)。(我已经使用下面的成本函子验证了这一点)。
为残差向量的每个元素定义单独的残差块(和隐式参数块)有什么好处
F
?如果残差
F1
取决于参数x1
并且x2
残差F2
取决于x3
和,则相对于x4
的成本会影响 的值吗?F
x1
x3
曲线拟合
另一个示例尝试查找参数m
和c
曲线y=e^(mx + c)
。
它定义了一些简单地ExponentialResidual
输出数据点的位置。T(y_) - exp(m[0] * T(x_) + c[0])
(x_, y_)
然后他们继续为每个观察添加一个残差块
- 虽然我懒得自己重现这个例子,但我怀疑这也可以用一个映射的残差块来完成
R^2 -> R^1
,其中一维残差只是所有的T(y_) - exp(m[0] * T(x_) + c[0])
总和(x_, y_)
?是否有必要为每个观察定义一个残差块?
感谢您阅读这篇长文!
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。我不明白原因。这两个实现都是静态库,不应该发生冲突。
- 来自 opencv 版本的所有文件都是用 gnustl_static 编译的吗?
- 为什么 __ndk1 出现在 std::vector 中?
- 对于一个大型项目,不同的工程师承担不同的子任务。他们应该链接一个常见的 stl 实现吗?静态联动和动态联动的要求不同吗?
ceres-solver - 类中目标函数的 ceres 求解器的实现
我是 Ceres 的初学者(已经研究了不到一周),并且正在尝试使用 ceres 求解器来求解我在课堂上的成本函数。以下是我的代码示例版本,我无法为 ceres 设置成本函数。
该过程应如下所示:我有一个包含 14 个参数的数组 initparam[14],它必须在 myStruct 的 operator() 中输入到我的类中。
当我尝试访问运算符中的 initparam 时,每个元素都不是双精度,而是 ceres Jet。
从我从其他一些博客文章中可以看到,我可能必须实现 ceres 文档( http://ceres-solver.org/interfacing_with_autodiff.html)中提到的这类东西。不幸的是,我对谷神星的了解有限,不确定这是否真的是正确的方法。有人可以帮我吗?如果需要,我很乐意提供更多信息