我试图尽量缩小3D空间的方块的差别,其中含有一组未知参数。
我有一套示范式的这些界碑(由3D职位和轮换代表),在优化结束时,这些界碑应与一套观察到的界碑匹配。
我使用"http://en.wikipedia.org/wiki/Levenberg%E2%80% 93 Marquardt_algorithm" rel=“nofollow”>Levenberg-Marquardt 优化一套未知参数,这些参数将改变模型3d标记的位置和旋转,直到它们与观察到的3d标记位置(或多或少)匹配。
观察到的3D标记来自计算机视距标记检测算法,它给出每个框架所见标记的代号,以及从每个标记的照相机( 使用COplanar sing )的转换。每个框架只能看到总标记组中的少量标记,在转换中也会有不准确之处。
我考虑过如何构建我的最小化功能, 我想尝试比较相对旋转, 并尽量缩小LM优化每次迭代的旋转差异。
ESTESY:
foreach (Marker m1 in markers)
{
foreach (Marker m2 in markers)
{
Vector3 eulerRotation = getRotation(m1, m2);
ObservedMarker observed1 = getMatchingObserved(m1);
ObservedMarker observed2 = getMatchingObserved(m2);
Vector3 eulerRotationObserved = getRotation(observed1, observed2);
double diffX = Math.Abs(eulerRotation.X - eulerRotationObserved.X);
double diffY = Math.Abs(eulerRotation.Y - eulerRotationObserved.Y);
double diffZ = Math.Abs(eulerRotation.Z - eulerRotationObserved.Z);
}
}
当 diffX、 diffY 和 diffZ 是要最小化的值时 。
我使用以下方法来计算角度:
Vector3 axis = Vector3.Cross(getNormal(m1), getNormal(m2));
axis.Normalize();
double angle = Math.Acos(Vector3.Dot(getNormal(m1), getNormal(m2)));
Vector3 modelRotation = calculateEulerAngle(axis, angle);
ocNormal(标记m)计算方形标记所在的平面的正常值。
我敢肯定,我在这里做错事了。 将这一切扔入LM 优化( 我使用< a href=""http://www. alglib. net/" rel="nofollow" >ALGLib a>) 似乎没有做任何事情, 它经过1次循环和结束, 并且没有改变任何未知参数( 最初全部为 0 ) 。
我在想,我试图将最小化的函数有问题。 似乎有时计算的角度( 第3行) 返回 NaN( 我正设置此选项来返回 diffX、 diffY、 diffZ 等值为 0 ) 。 比较上面的流动角度是否有效?
如有任何帮助,将不胜感激。
<强 > 更多信息: 强 >
- Program is written in C#, I am using XNA as well.
- The model markers are represented by its four corners in 3D coords
- All the model markers are in the same coordinate space.
- Observed markers are the four corners as translations from the camera position in camera coordinate space
- If m1 and m2 markers are the same marker id or if either m1 or m2 is not observed, I set all the diffs to 0 (no difference).