|
Human Tracking and Motion
Animation
|
指導教授:賴尚宏
姓名:吳奇峻、劉紹偉
學校:清華大學
系級:資工04級 |
1. Abstract
這一次專題,是研究如何模擬人體的運動。在模擬人體的運動中,有很多種的做法,例如「貼亮點」
就可以達成追蹤人體運動的目的。但是這次我們是利用DV拍一段影片,然後去追蹤人體的運動,再利
用網路上下載的人體模型,去模擬影片中人物的運動。 |
2. Our Approach
- 模型處理
- 取得模型:根據老師所給的網址( http://www.cyberware.com/samples/ ),我們可以上網下載模型。
- 分析模型:上網下載的模型,我們可以利用Plyview軟體,去檢閱取得的模型,不論是大小,形狀都可以很清楚的顯示出來。
- 轉檔:利用Plyview可以把抓下來的模型轉成各式各樣的檔案模式,利如Visual Studio、object…等等。不過我們嘗試了取多檔案類型,後來決定用object file format,其檔案模式輸出的內容為:
- 所有點的數目以及所有點的資訊。
- 所有三角片對應的點。
- OpenGL:利用OpenGL來將取得點的資訊,顯示在電腦螢幕上,不過因為網上的模型跟我們OpenGL顯示的的座標軸有差異,因此我們修正取得的點而使模型是面向著我們。
- 截取部分資訊:因為人體的運動是根據關節來移動,所以我們也是根據每一個關節來讓整個模型移動,不過因為網上的模型並沒有區分手肘或是大小腿,所以我們利用好幾條直線來將整個身體切成14個部分,分成「頭」「身體」「左右上下手臂」「左右手腕」「左右大小腿」「左右腳掌」。
- 運算關節點位置:我們利用分好的部分資訊來運算關節點。比如說我們要算左手肘這個關節點,那我們將左上手臂最靠近手肘的10個點,跟左下手臂最靠近手肘的10個點來算出關節點位置。那怎麼知道最靠近手肘是哪些點 ? 我們是利用Y軸的方向來取得靠近手肘的關節點。
- 初始化模型位置:因為影片中的第一張frame的初始位置並不是跟模型的初始位置一樣,因此我們利用Quaternion and Rotation[3]來將模型的位置調成跟影片的位置一樣。
- 模型運動
- 分析資料:我們先試著把得到的3-D偵測資料顯示在螢幕上,當然也是用OpenGL來完成,而且我們把每兩個關節點連成一條線來看它的移動情形。結果發現,得到的關節點資料所構成的人形,跟我們抓到的的模型,大小上有一定的差距,這個問題在旋轉方面是不講成問題,但是在平移方面卻有可能有一定的影響力。
- 旋轉關節點:我們已經將各個關節點都已經求出來了,所以我們現在依照偵測資料去運算要旋轉多少或是平移多少。
- 假設現在要旋轉 a、b兩個關節點,我們得到資料為
T0:a0(Px1, Py2, Pz1),b0(Px2, Py2, Pz2)
T1:a1(Nx1, Ny2, Nz1),b1(Nx2, Ny2, Nz2)
- V0 = a0 - b0, V1 = a1 - b1
- 用V0、V1這兩個向量去構成一個平面並算出其法向量Ortho[1],用Ortho去當作旋轉軸使得V0旋轉到V1。
- 用V0、V1那兩個向量算出其夾角θ[2]。
- 套用在模型上,根據Ortho、θ以及T0時的模型關節點位置,用Quaternion and Rotation[3]去旋轉模型的關節點。
- 非關節點移動:在3-D空間中要旋轉每一個點,必需要有一個旋轉點,一個旋轉軸,以及旋轉角度。因此在旋轉所有點的時候,每一個點必需相對應有一個旋轉點,因此我們抓每一個部位的靠近頭的關節點當作旋轉點,例如上手臂就抓肩膀,大腿就抓骨盆,小腿就抓膝蓋......等等。
- 貼三角片:我們之前所著重的都是點的移動,因為如果點的移動是正常的,那麼三角片也不會失真,不過要注意的就是在背後的三角片不能顯示,這個問題由OpenGL就可以解決了。
|
3. Flow diagram
|
4. Experimental Results
|
5. Difficulties
有問是的是旋轉那一方面,一開始的做法是投影在x-y平面上,然後去做旋轉,再投影於y-z平面上,做第二
次旋轉,即是使用x軸以及z軸去當做旋轉軸。用此方法來達成我們在3D空間中的旋轉。
後來實際去實作出來的結果並不是我們所期望的。後來我們參考已畢業學長的paper,發現到可以運用Quaternion and Rotations
去達成我們所需的3D空間中旋轉。去實作出來的效果出乎意料的好,不過,當我們把全身都畫出來的時候
,發現有時候腳或手會有不正常的運動,發現最有可能的兩點是:
- 得到的"火柴人"的比例跟模型的比例相差太大,導致移動的角度過大。
- 因為是用2D畫面來偵測3D空間的運動,所以對於z軸的偵測會有誤差,而這個誤差可能會因為時間愈長,導致誤差累積,所以誤差愈大。
我們將偵測出來的資料,先經過smooth,然後再去做旋轉。一些本來有的問題,都大幅減少,雖然沒辦法完全解決,不過至少看起來就比較正常了。
|
6. Future work
- 手跟腳都會因為旋轉之後,發生類似抽慉的現象。
- 模型還未貼Texture。
- 關節周圍的點,會因為彎曲而造成「收縮」以及「拉長」,不能只是依照旋轉而去動關節附近的點。
- 還不能Real Time運動,因所需計算量過於龐大。
|
7. Appendix
- Ortho:Orthogonal Line = V1 cross V2
- θin 3-D:cosθ= V1 dot V2 / |V1|*|V2|
- Quaternion and Rotation
- To rotate a 3D unit vector v around an arbitrary axis u with 2θdegrees, we first define quaternion vector q for this rotation operation as follows : q = cos(θ) + u*sin(θ)
- The above rotation operation on a vector v is given as follows :
- V is the 4-dimensional quaternion representation of 3D unit vector v, given by v = (0, v), q* is the conjugate of q, given by
q* = cos(θ) - u*sin(θ)
|
8. References
- Visual C++ 6 視窗程式設計經典 林俊杰
- OpenGL 1.1 Reference
- Computer Graphics (Comp236) at University of North Carolina, U.S.A
- 柯毅暉, 清華大學碩士論文, "3D model-based human tracking in monocular
image sequences".
|
|