1. 程式人生 > >dlib 人臉對齊 基本原理

dlib 人臉對齊 基本原理

程式碼

extract_image_chip(img, dlib::get_face_chip_details(shape, 150, 0.25), face_chip);

dlib::get_face_chip_details(shape, 150, 0.25)
輸入引數:shape為提取的人臉關鍵點,68個點
160為希望獲取的對齊後的人臉大小
0.1 是希望對人臉關鍵點區域進行padding的比例

1.padding的含義
dlib內部使用了51個人臉關鍵點進行對齊,如下圖所示:
這裡寫圖片描述

假設padding大小為0.25,padding之後的人臉關鍵點如下圖所示:
這裡寫圖片描述

上述兩幅影象為同樣大小,均為150*150,可以看到使用0.25為係數進行padding之後得到的人臉區域明顯內收,得到了包含更大面部區域的對齊影象。

2.get_face_chip_details(shape, 150, 0.25)
函式的計算過程分為兩部分:

  • 首先對上述第二幅圖所示的關鍵點中選取編號為10-37,43-47的關鍵點,也就是鼻子、左眼、右眼及上嘴脣部分的基準關鍵點,同時獲取當前影象檢測出的對應位置的關鍵點;
  • 計算上述兩個點集之間的相似變換矩陣,獲取當前人臉影象相對於基準人臉間的旋轉角度、縮放係數及應該獲取的人臉區域的rect座標。
    注:相似變換及進行二維影象間的旋轉、平移及縮放,在改變的過程中保持形狀不變(大小方向和位置可變)的圖形,也就是正方形變換完還是正方形,不會像仿射變換一樣還可以變換為平行四邊形。
    下圖參考自:
    https://blog.csdn.net/u014096352/article/details/53526747

    這裡寫圖片描述

3.void extract_image_chip (const image_type1& img,const chip_details& location,image_type2& chip,const interpolation_type& interp)
函式的作用是根據計算出的相似變換的矩陣location,從原始影象img中得到變換後的影象塊chip,使用interp插值方法。

總結

dlib的人臉對齊是基於鼻子、雙眼和上嘴脣的相似變換,在不改變面部重點五官形狀的基礎上將人臉對齊到基準人臉。