Android實現人臉識別的詳細過程

2021-06-19 01:20:34 字數 3325 閱讀 7676

照相時,在預覽畫面上提示使用者人臉的位置,並完成自動對焦等,是個錯的應用; 下面是實現細節,我們知道在android的**中已有人臉識別的底層演算法**,而且在framework層也封了呼叫的api函式

import android.media.facedetector;

import android.media.facedetector.face;

//harrison add 

private void drawrectonface()

mpremidpoint.x = midpoint.x;

mpremidpoint.y = midpoint.y;

mfindfaceview.setvisibility(view.visible);

} else

mfindfaceview.drawrects(mface, numberoffacedetected);

}//呼叫api找人臉,需要import進軟體包哦!

private void findfacesinbitmap(bitmap mybitmap)

private bitmap rotatemybitmap(bitmap bitmap)

private bitmap scalemybitmap(bitmap bitmap)

//處理格式,一般攝像頭抓到的資料為imageformat.nv21,不同的格式,需要調整的。

private void decodetobitmap(byte data, android.hardware.camera _camera)

} else

if (tmpscalebmp != null)

} else

drawrectonface();

if (mybitmap != null)

}} catch (exception ex)  

mcameradevice.setpreviewcallback(mpreviewcallback);

}private  final class postpreviewcallback implements previewcallback }

複製**

我們知道,相機預覽是用 su***ceview來顯示的;在我們畫提示框時,不能直接用那個view的,會出現黑屏的狀態,預覽的畫面也不流暢的。新增乙個一樣大小的su***ceview來提示。

在xml布局中新增

android:layout_width="match_parent"

android:layout_height="match_parent"/>

android:id="@+id/faces_rectangle"  

android:layout_width="fill_parent"  

android:layout_height="fill_parent" />

複製**

我的畫提示框**:

package com.android.camera;

import android.content.context;

import android.graphics.canvas;

import android.graphics.bitmap;

import android.graphics.color;

import android.graphics.paint;

import android.graphics.rect; 

import android.graphics.paint.style;

import android.graphics.pixelformat;

import android.graphics.porterduffxfermode;

import android.graphics.porterduff;

import android.util.attributeset;

import android.util.log;

import android.view.su***ceholder;

import android.view.su***ceview;

import android.view.view;

import android.graphics.pointf;

import android.media.facedetector;

import android.media.facedetector.face;

public class findfaceview extends su***ceview implements su***ceholder.callback

public void su***cechanged(su***ceholder arg0, int arg1, int w, int h)

public void su***cecreated(su***ceholder arg0)

public void su***cedestroyed(su***ceholder arg0)

void setcamerapreviewsu***ceholder(su***ceholder  sh)

public int getfaceviewwidth()

public int getfaceviewheight()

void cleardraw()

public void drawrects(facedetector.face mface, int numberoffacedetected) else

face face = mface[i];

pointf mymidpoint = new pointf();

face.getmidpoint(mymidpoint);

meyesdistance = face.eyesdistance();

log.i("harrison", "i="+i+"("+mymidpoint.x+", "+mymidpoint.y+")");

canvas.drawrect((int)(mymidpoint.x-meyesdistance),

(int)(mymidpoint.y-meyesdistance),

(int)(mymidpoint.x+meyesdistance),

(int)(mymidpoint.y+meyesdistance), 

p);}

sh.unlockcanvasandpost(canvas);

}//測試兩個view是否錯移

public void drawbitmap(bitmap mybitmap)

public void dodraw()  }

複製**

人臉識別的流程

記錄一下目前對人臉識別流程及識別方法的理解,以後隨著認識的提公升不斷更新 在整個過程中所使用的都是灰度化之後的。為什麼要轉化為灰度?1.識別物體最關鍵的部分是,找到物體的邊緣,就是的梯度,的梯度計算用到的就是灰度化之後的。2.顏色容易受到光照影響,難以提供關鍵資訊,最重要的是灰度化之後可以加快計算速...

人臉識別的深度學習

深度學習只不過是機器學習的標準範例,更準確地說 是其演算法之一。在最大程度上,它基於人腦的概念和神經元的相互作用。如果你開始谷歌搜尋深度學習是什麼,你會發現今天這個超級熱門詞遠遠不是新的。為什麼這樣?該術語本身出現在20世紀80年代,但到2012年,沒有足夠的力量來實施這項技術,幾乎沒有人關注它。在...

人臉識別的深度學習

深度學習只不過是機器學習的標準範例,更準確地說 是其演算法之一。在最大程度上,它基於人腦的概念和神經元的相互作用。如果你開始谷歌搜尋深度學習是什麼,你會發現今天這個超級熱門詞遠遠不是新的。為什麼這樣?該術語本身出現在20世紀80年代,但到2012年,沒有足夠的力量來實施這項技術,幾乎沒有人關注它。在...