照相時,在預覽畫面上提示使用者人臉的位置,並完成自動對焦等,是個錯的應用; 下面是實現細節,我們知道在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年,沒有足夠的力量來實施這項技術,幾乎沒有人關注它。在...