人臉和眼瞼的實時檢測
1、LBP和HAAR特征級聯(lián)檢測器,實現(xiàn)人臉和眼睛的檢測,首先介紹基于圖片的人臉檢測,再引入JavaCameraVeiw,, 對Android端的相機調用和數(shù)據(jù)讀取,使用攝像頭數(shù)據(jù)流,進行人臉和眼睛的實時檢測與跟蹤,
級聯(lián)分類器介紹
opencv中的人臉檢測是基于訓練好的 LBP和 HAAR的特征級聯(lián)分類檢測器完成的
LBP特征: Local Binary Pattern 局部二值模式, LBP的應用中, 如紋理分類、人臉分析等, 一般采用 LBP特征譜的統(tǒng)計直方圖作為特征向量用于分類識別.
HAAR特征: 一種反映圖像灰度變化的, 像素分模塊求差值的一種特征.
單個 LBP或者 HAAR 特征都可以檢測分類邊緣、直線、角點等特征, 但是容易受到外界噪聲、像素混疊等各種干擾, 導致誤判, 所以他們單個都是弱分類器, 只有通過這些聯(lián)級分類器的特征點才會被保存, 否則會被拋棄, 然后再進一步使用更多的強分類器聯(lián)級對特征區(qū)域記性候選檢測, 知道滿足條件, 輸出檢測得到的最終結果.
人臉進測
OpenCV自帶訓練好的人臉檢測模型
HAAR和 LBP目錄位置
/OpenCV-android-sdk/sdk/etc/
加載預訓練特征 xml 數(shù)據(jù), 在資源目錄下創(chuàng)建一個文件夾raw, 把/sdk/etc/下面的 lbpcascade_frontalface_improved.xml 復制到 raw文件中.
初始化聯(lián)級分類器的方法:
//cascadeClassifier 聯(lián)級分類器;
private void initClassifier(){
try{
InputStream si = getResources().openRawResource(R.raw.lbpcascade_frontalface_improved);
File cascadDir = getDir("cascade",Context.MODE_PRIVATE);
File cadcadFile = new File(cascadDir,"lbpcascade_frontalface_improved.xml");
FileOutputStream os = new FileOutputStream(cascadeFile);
byte[] buffer = new byte[4096];
int read;
while((read = is.read(buffer)) != -1){
os.write(buffer);
}
is.close();
os.close();
CascadeClassifier cascadeClassifier = new CascadeClassifier(cascadeFile.getAbsolutePath());
cascadeFile.delete();
cascadeDir.delete();
}catch(Exception e){
e.printStackTrace();
}
}
detectMultiScale方法的調用
初始化加載后, 就可以調用它的 detectMultiScale方法設置好相關參數(shù)以實現(xiàn)人臉檢測
/**
* img 輸入圖像
* objects 表示檢測到的對象個數(shù), 返回每個對象的矩形坐標
* scaleFactor 尺度變換的比率 基本在 1.05 ~ 1.2 之間比較好
* minNeighbors 領域范圍內符合條件的對象個數(shù), 它是輸出檢測最終 BOX的重要閾值, 太大則條件苛刻丟失檢測對象, 太小容易檢測錯誤;
* flags OpenCV 2.x 使用
* minSize 對象檢測的最小范圍
* maxSize 對象檢測的最大范圍
**/
detectMultiScale(Mat img, MatOfPoint objects, double scaleFactor, int minNeighbors, int flags, Size minSize, Size maxSize)