2013-05-06 106 views
7

我試圖根據2D圖像2D image找到人臉的三個角度。使用OpenCV,C++和圖像2D進行頭部姿態估計 - 幾何方法 - 滾動,偏航和俯仰

我使用OpenCV與HaarCascade來尋找臉部,眼睛,鼻子和嘴巴。 但我沒有找到任何幾何方法可以幫助我找到角度X,Y和Z(滾動,俯仰和偏航)。

有人可以幫助我顯示一些方法在c + +或java的工作嗎?

+0

這不是一個C++的問題,所以我刪除該標籤。 – 2013-05-06 15:15:03

回答

5

給定一個圖像,沒有其他信息,角度沒有單一的解決方案。考慮只是偏航的情況。投射到2d平面上,這可以看作是眼睛之間投射距離和眼睛相對於鼻子/嘴巴的放置的小改變。然而,這個距離並不是人與人之間的一個常數。

解決這個問題的一個典型方法是要求用戶通過直接觀察攝像機標定'0'角度來「校準」他們的臉部。此時,您現在擁有可以比較後續圖像的參考長度。

然而,長度仍然不是足夠的信息,因爲視在投影距離的變化量取決於光學元件和臉部距相機的距離。您通常手動配置的鏡頭;您可以通過假設「平均」面部尺寸並假設「標稱」圖像完美匹配這些尺寸來估算距離。如果發現超過或低估了某個特定臉部的旋轉,則可以將其調整爲可調整的。

一旦你完成了所有這些假設,它就是相當簡單的幾何體。你可以估計從眼睛通過鼻子到嘴巴的速度。您可以測量眼睛之間的間距來估計偏航。最後,您可以使用眼睛/嘴巴或眼睛/鼻子之間的間距來估計音高。請記住,這些假設在臉部仍然非常接近名義時效果最好。

+0

但我想知道一些在C++中的方法來做到這一點。 – 2013-05-07 13:08:47

0

所以,你想根據鼻子,眼睛和嘴巴的位置找到臉部的方向(以RPY角度)。假設所有三個(四 - 二隻眼睛)都可見,我將使用臉部的對稱特徵來確定頭部的方向,例如:

眼睛之間的線條可用作其中一個軸(例如Pitch)。然後,我們可以假設滾軸指向鼻子的方向 - 可以通過鼻子到眼睛中點的位置移動來測量。最後,可以通過眼睛中點,鼻子位置和嘴部位置之間的距離關係來測量偏航。

我不知道四個興趣點之間的距離關係,他們可能在性別,年齡和出身方面有所不同。然而,如果你能找到這樣的關係,角度的推導在數學上應該是相當直接的。

有趣的應用程序的方式!

0

如果使用級聯分類檢測右眼,左眼和鼻子,計算每一個特徵的重心(特徵量x/2,功能Y/2),這會給你的形象三個X-Y點。

您可以通過查看每隻眼睛的Y值來檢測滾動,如果其中一個高於另一個,則表示頭朝最低Y值的方向傾斜(因爲一隻眼睛向上移動,另一隻眼睛向下移動)

您可以通過查看鼻子的X值來檢測偏航,如果用戶向左看,他們鼻子的X值將更接近他們左眼的X值,並且與向右看在右眼X值。

您可以通過觀察鼻子的Y值檢測間距,如果用戶查找,Y值將接近雙眼Y值,如果他們看不起,Y值將進一步遠離眼睛的價值。

現在這當然不是非常準確,不會給你確切的角度,但是你可以使用這些信息嘗試和分類某些組內的每個值,即(向前看,向左看,看起來真的是左側)

我能看到的唯一影響你計算所有三個在一個圖像可能是如果滾動是相當激烈的計算偏航可能會很麻煩,因爲X軸不再平坦。

您可以通過2D旋轉校正圖像來解決此問題。 你需要找到的圖像需要多少與

Value = (right eye Y/2) - (left eye Y/2) 

旋轉,有了這個信息,您可以校正圖像,並處理繼續(旋轉圖像查找創建二維旋轉矩陣,並使用經仿射)

很抱歉,如果這是一個有點死靈的,但我發現上面的方法是相當成功的,我希望它幫助別人

相關問題