要進行人臉的識別,尤其是複雜環境下的人臉識別,就要在捕獲人臉影象之後對影象進行預處理的工作,如影象的大小和灰度的歸一化,頭部姿態的矯正,影象分割等。這樣做的目的是改善影象質量,消除雜訊,統一影象灰度值及尺寸,為後序特徵提取和分類識別打好基礎。
該文將就人臉的剪下和歸一化操作進行學習**,並做一筆記備用。
由於opencv的人臉識別需要輸入具有相同的尺寸和灰度級,所以識別之前還要進行很重要的一步工作,就是針對人臉識別的需要調整人臉,具體可以分為以下步驟:
這裡我設想的最基本的人臉剪下方法是根據人眼的位置進行人臉的旋轉和校正的。基本思路如下:
根據兩眼的傾斜角度對影象進行旋轉校正下面是剪下的效果圖,最終的是100*100畫素,偏移量是0.3根據兩眼在中的實際距離和自定義的偏移量進行的縮放
detecting face
cropping result
其**為:
cv::mat faceclassifer::cropfacesbasedoneye(cv::rect facerect,
cv::point lefteye,cv::point righteye,
float offset,int outputwidth,int outputheight)
//crop the rotated image
cv::point crop_xy(lefteye.x-scale*offset_h,lefteye.y-scale*offset_v);
cv::size crop_size(outputwidth*scale, outputheight*scale);
cv::rect crop_area(crop_xy, crop_size);
cv::mat cropface;
if(eyegap_v == 0)
cropface = _image(crop_area);
else
cropface = rotatedimage(crop_area);
//resize the face
cv::resize(cropface,cropface,cv::size(outputwidth,outputheight));
cv::mat croppedgray;
cv::cvtcolor(cropface,croppedgray,cv_bgr2gray);
cv::equalizehist(croppedgray, croppedgray);
return croppedgray;
}
解釋一下**:
這裡旋轉用到了opencv的函式,warpaffine()。
這裡涉及到了仿射變換,可以參考opencv官方文件,放射變換。
void faceclassifer::rotateface(cv::mat& src,cv::point& pt,double angle,cv::mat& dst)
這裡我以左眼的中心點作為旋轉的輸入原點,cv::getrotationmatrix2d()生成了表示仿射變換的2 * 3矩陣。
github主頁(
csdn部落格(
計算機視覺 人臉檢測與識別
長文乾貨!走近人臉檢測 從 vj 到深度學習 上 長文乾貨!走近人臉檢測 從vj到深度學習 下 caffe實踐 基於caffe的人臉檢測實現 人臉檢測 ddfd 人臉檢測 cascadecnn cascadecnn人臉檢測學習筆記 python批量預處理 cascadecnn訓練前期預處理 casc...
計算機視覺 opencv人臉識別
import cv2 步驟1 載入影象 gray cv2.cvtcolor img cv2.color bgr2gray 將影象轉換成灰度模式 opencv載入影象的方式是bgr cv2.imshow test gray cv2.waitkey 0 為什麼不直接在載入影象的時候指定灰度影象?而是要轉...
計算機視覺之人臉學習(一)
一.深度學習的基本概念 1.卷積神經網的思維導圖 2.深度學習的發展歷程 三起兩落 1943年,人工神經網路 沒有得到重視 1957年,感知器模型 解決常見的線性分類和線性回歸的任務,但沒有辦法解決異或問題 1980年,多層感知器 解決單層感知機的問題,但沒辦法解決網路引數的計算問題 1986年,反...