2012-05-23 33 views
0

我想盡量減少三維空間中方形標記組與一組未知參數之間的差異。在數學優化中使用的兩個標記之間的尋找角度

我有這些方形標記的模型集(用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(沒有不同)。
+0

看起來你已經有了標題問題的答案。那麼這裏的實際問題是什麼?這聽起來像你只需要遍歷代碼並進行調試,這是我們在沒有所有代碼的情況下無法爲你做的事情。 –

+0

有幾個問題 - (1)getNormal是否返回正常或單位正常? (2)Normalize是否突變Vector3實例或返回一個新實例? –

+0

你有沒有試過http://en.wikipedia.org/wiki/Iterative_closest_point算法?它旨在解決類似問題 – MBo

回答

1

起初我以爲這可能是一個錯字,但後來我意識到這可能是一個錯誤,自己過去一直是類似案例的受害者。

不宜diffY和diffZ是:

double diffY = Math.Abs(eulerRotation.Y - eulerRotationObserved.Y); 
double diffZ = Math.Abs(eulerRotation.Z - eulerRotationObserved.Z); 

我沒有足夠的聲譽張貼此作爲一個評論,所以張貼作爲一個答案!

+0

對不起,複製時出錯,是的應該是這樣。它被複制了一些舊的代碼。 – Jkh2

0

這是什麼運氣?假設你想最小化所有標記組合的所有差異的「總和」是否正確?我想如果你想使用LM,你不應該使用Math.Abs

另一種方法是手動制定目標函數並使用另一個優化器。我最近移植兩個非線性優化到C#它甚至不需要你來計算衍生工具:

  • COBYLA2,支持非線性約束,但需要更多的迭代。
  • BOBYQA,限於變量邊界約束,但提供了相當有效的迭代方案。
相關問題