我想用
ceres
计算三角坐标。
对于这个问题我需要解决的网格坐标在一个网格。每个三角形都有它自己的顶点,但是结构如三角形(3个顶点)和边(4个顶点)是可用的。
示例数据(伪代码):
triangles = [[v1, v2, v3], [v4, v5, v6]]
inner_edges = [[[v1, v4], [v2, v5]]]
边
[v1, v2]
和
[v4, v5]
最初是相同的,这可能在解决过程中发生变化。
现在我有两个成本函数,一个是三角形,一个是内边缘。
f([v1, v2, v3]) = res_t1
g([v1, v4, v2, v5]) = res_2
有两种简单的块状结构
-
两个块,一个具有所有三角形剩余,一个具有所有边剩余。
-
每个三角形一个块,每个边一个块。
第一个解向量
x
所有坐标(
2*|V|
因为每个顶点有两个坐标),因为块依赖于所有顶点。在第二块中,三角形块只依赖于三个顶点和四个顶点上的边缘块。
我现在想使用第二个,因为我期望更好的性能和更好的收敛性。
如何设置CURES来解决相同的坐标,而只考虑顶点的子集与当前残渣相关?
我试着用大小6和8设置问题,并在
X
但是,CIES不允许使用具有不同偏移量的相同结果指针。
接下来我试着用
SubsetParameterization
比如这样
vector<double> x(mesh.n_faces()*6);
for(int i=0; i < mesh.n_faces(); i++){
vector<int> const_params;
for(int j = 0; j < mesh.n_faces(); j++) {
if(i != j) {
const_params.push_back(6*j);
const_params.push_back(6*j+1);
const_params.push_back(6*j+2);
const_params.push_back(6*j+3);
const_params.push_back(6*j+4);
const_params.push_back(6*j+5);
}
}
auto *ssp = new ceres::SubsetParameterization(mesh.n_faces() * 6, const_params);
problem.AddParameterBlock(x.data(), mesh.n_faces() * 6, ssp);
problem.AddResidualBlock(face_cost_function, NULL, x.data());
}
但是谷神星检查告诉我这两种变体都是错误的。
因为(1)我得到
local_parameterization.cc:98 Check failed: constant.back() < size Indices indicating constant parameter must be less than the size of the parameter block.
为了(2)我得到
problem_impl.cc:135 Check failed: size == existing_size Tried adding a parameter block with the same double pointer, 000002D736397260, twice, but with different block sizes. Original size was 1152 but new size is 6
如何设置CURES,这样我就可以在重叠块中分割相同的问题,这只会影响一些结果变量?