我想盡量減少三維空間中方形標記組與一組未知參數之間的差異。在數學優化中使用的兩個標記之間的尋找角度
我有這些方形標記的模型集(用3d位置和旋轉表示),它應該在優化結束時與一組觀察到的方形標記相匹配。
我使用Levenberg–Marquardt來優化未知參數集,這些參數將改變模型3d標記的位置和旋轉,直到它們與觀察到的3D標記位置(或多或少)匹配。
觀察到的3d標記來自計算機視覺標記檢測算法。它給出了每幀中所見的標記的標識以及每個標記的相機轉換(using Coplanar posit)。每個「框架」只能在整套標記中看到少量標記,轉換中也會有不準確之處。
我想過如何構建我的最小化函數,我想試圖比較相對旋轉並最小化LM優化的每次迭代中旋轉之間的差異。
本質:
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);
getNormal(標記M)計算垂直於所述正方形標記位於的平面。
我相信我在這裏做錯了。把這一切投入LM優化器(我使用ALGLib)似乎沒有做任何事情,它經歷了1次迭代並完成而沒有改變任何未知參數(最初都是0)。
我在想,我想盡量減少的功能有問題。看起來有時角度計算(第三行)返回NaN(我目前正在設置這種情況下返回diffX,diffY,diffZ爲0)。比較上述歐拉角度還有效嗎?
任何幫助將不勝感激。
更多信息:
- 計劃是寫在C#中,我使用XNA以及。
- 模型標記由三維座標中的四個角表示
- 所有模型標記都位於同一座標空間中。
- 觀察到的標記是相機座標空間中相機位置的平移的四個角
- 如果m1和m2標記是相同的標記ID或者如果沒有觀察到m1或m2,我將所有差異設置爲0(沒有不同)。
看起來你已經有了標題問題的答案。那麼這裏的實際問題是什麼?這聽起來像你只需要遍歷代碼並進行調試,這是我們在沒有所有代碼的情況下無法爲你做的事情。 –
有幾個問題 - (1)getNormal是否返回正常或單位正常? (2)Normalize是否突變Vector3實例或返回一個新實例? –
你有沒有試過http://en.wikipedia.org/wiki/Iterative_closest_point算法?它旨在解決類似問題 – MBo