opencv人臉識別android
❶ 怎樣使用OpenCV進行人臉識別
網上帖子不是很多麼,這個是我自己簡單寫的,注釋的部分刪了吧,就可以簡單識別人臉了
#include<opencv2corecore.hpp>
#include<opencv2imgprocimgproc.hpp>
#include<opencv2highguihighgui.hpp>
#include<opencv2videoackground_segm.hpp>
#include<opencv2/objdetect/objdetect.hpp>
#include<iostream>
usingnamespacecv;
voiddetectAndDraw(Mat&img,CascadeClassifier&cascade,
CascadeClassifier&nestedCascade,
doublescale,booltryflip);
//Matimageresize(Mat&image,Sizesize);
/*intmain(){
//VideoCapturecap(0);//打開默認攝像頭
VideoCapturecap("F:/nihao.mp4");
if(!cap.isOpened())
{
return-1;
}
Matframe;
Matedges;
CascadeClassifier滾昌卜cascade,nestedCascade;
boolstop=false;
//訓練好的文件名稱,放置在可執行文件同目錄下
cascade.load("haarcascade_frontalface_alt.xml");
nestedCascade.load("haarcascade_eye_tree_eyeglasses.xml");
while(!stop)
{
cap>>frame;
detectAndDraw(frame,cascade,nestedCascade,2,0);
if(waitKey(30)>=0)
stop=true;
}
return0;
}
*/
intmain(){
Matimage=imread("F:/quanjiafu.jpg");
CascadeClassifiercascade,nestedcascade;
cascade.load("F:/Opencv2.4.9/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml");
nestedcascade.load("F:/Opencv2.4.9/opencv/sources/data/haarcascades/haarcascade_eye_tree_eyeglasses.xml");
detectAndDraw(image,cascade,nestedcascade,2,0);
waitKey(0);
return0;
}
voiddetectAndDraw(Mat&img,CascadeClassifier&cascade,
CascadeClassifier&nestedCascade,
doublescale,booltryflip)
{
inti=0;
doublet=0;
//建立用於存放人臉的向量容器
vector<Rect>faces,faces2;
//定義一些顏色,用來標示不同的人臉
conststaticScalarcolors[]={
CV_RGB(0,0,255),
CV_RGB(0,128,255),
CV_RGB(0,255,255),
CV_RGB(0,255,0),
CV_RGB(255,128,0),
CV_RGB(255,255,0),
CV_RGB(255,0,0),
CV_RGB(255,0,255)};
//建立縮小的圖片,加快檢測速度
//ntcvRound(doublevalue)對一個double型的數進行四捨五入,並返回一個整型數!
Matgray,smallImg(cvRound(img.rows/scale),cvRound(img.cols/scale),CV_8UC1);
//轉成灰度圖像,Harr特徵基於灰度圖
cvtColor(img,gray,CV_BGR2GRAY);
迅圓//改變圖像大小,使用雙線性差值
resize(gray,smallImg,smallImg.size(),0,0,INTER_LINEAR);
大穗//變換後的圖像進行直方圖均值化處理
equalizeHist(smallImg,smallImg);
//程序開始和結束插入此函數獲取時間,經過計算求得演算法執行時間
t=(double)cvGetTickCount();
//檢測人臉
//detectMultiScale函數中smallImg表示的是要檢測的輸入圖像為smallImg,faces表示檢測到的人臉目標序列,1.1表示
//每次圖像尺寸減小的比例為1.1,2表示每一個目標至少要被檢測到3次才算是真的目標(因為周圍的像素和不同的窗口大
//小都可以檢測到人臉),CV_HAAR_SCALE_IMAGE表示不是縮放分類器來檢測,而是縮放圖像,Size(30,30)為目標的
//最小最大尺寸
cascade.detectMultiScale(smallImg,faces,
1.1,2,0
//|CV_HAAR_FIND_BIGGEST_OBJECT
//|CV_HAAR_DO_ROUGH_SEARCH
|CV_HAAR_SCALE_IMAGE
,
Size(30,30));
//如果使能,翻轉圖像繼續檢測
if(tryflip)
{
flip(smallImg,smallImg,1);
cascade.detectMultiScale(smallImg,faces2,
1.1,2,0
//|CV_HAAR_FIND_BIGGEST_OBJECT
//|CV_HAAR_DO_ROUGH_SEARCH
|CV_HAAR_SCALE_IMAGE
,
Size(30,30));
for(vector<Rect>::const_iteratorr=faces2.begin();r!=faces2.end();r++)
{
faces.push_back(Rect(smallImg.cols-r->x-r->width,r->y,r->width,r->height));
}
}
t=(double)cvGetTickCount()-t;
//qDebug("detectiontime=%gms ",t/((double)cvGetTickFrequency()*1000.));
for(vector<Rect>::const_iteratorr=faces.begin();r!=faces.end();r++,i++)
{
MatsmallImgROI;
vector<Rect>nestedObjects;
Pointcenter;
Scalarcolor=colors[i%8];
intradius;
doubleaspect_ratio=(double)r->width/r->height;
if(0.75<aspect_ratio&&aspect_ratio<1.3)
{
//標示人臉時在縮小之前的圖像上標示,所以這里根據縮放比例換算回去
center.x=cvRound((r->x+r->width*0.5)*scale);
center.y=cvRound((r->y+r->height*0.5)*scale);
//Sizes=Size(cvRound((r->width+r->height)*0.25*scale)*2,cvRound((r->width+r->height)*0.25*scale)*2);
//Matimage=imread("F:/yaoming1.jpg");
//Matnimage=imageresize(image,s);
//MatimageROI=img(Rect(center.x-s.width/2,center.y-s.height/2,nimage.cols,nimage.rows));
//addWeighted(imageROI,0.1,nimage,3,0.,imageROI);
radius=cvRound((r->width+r->height)*0.25*scale);
circle(img,center,radius,color,2,8,0);
}
else
rectangle(img,cvPoint(cvRound(r->x*scale),cvRound(r->y*scale)),
cvPoint(cvRound((r->x+r->width-1)*scale),cvRound((r->y+r->height-1)*scale)),
color,3,8,0);
if(nestedCascade.empty())
continue;
smallImgROI=smallImg(*r);
//同樣方法檢測人眼
nestedCascade.detectMultiScale(smallImgROI,nestedObjects,
1.1,2,0
//|CV_HAAR_FIND_BIGGEST_OBJECT
//|CV_HAAR_DO_ROUGH_SEARCH
//|CV_HAAR_DO_CANNY_PRUNING
|CV_HAAR_SCALE_IMAGE
,
Size(30,30));
for(vector<Rect>::const_iteratornr=nestedObjects.begin();nr!=nestedObjects.end();nr++)
{
center.x=cvRound((r->x+nr->x+nr->width*0.5)*scale);
center.y=cvRound((r->y+nr->y+nr->height*0.5)*scale);
radius=cvRound((nr->width+nr->height)*0.25*scale);
circle(img,center,radius,color,3,8,0);
}
}
cv::imshow("result",img);
}
//Matimageresize(Mat&image,Sizesize){
//Matnimage=Mat(size,CV_32S);
//resize(image,nimage,size);
//returnnimage;
❷ android 使用opencv人臉識別
恩,不錯,加油
❸ 用OpenCV開發人臉識別軟體,用java好還是用C/C++好
我去年就用opencv開發的android手機端的關於人臉識別的增強現實應用。我可以很明確的告訴你,java的opencv頂多調用攝像頭用,圖像處理都用c++的opencv。對於opencv的開發,不管從開發效率還是執行效率,絕對是c++。java版的opencv想都不要想。
❹ 怎樣使用OpenCV進行人臉識別
1.介紹Introction
從OpenCV2.4開始,加入了新的類FaceRecognizer,我們可以使用它便捷地進行人臉識別實驗。本文既介紹代碼使用,又介紹演算法原理。(他寫的源代碼,我們可以在OpenCV的opencv\moles\contrib\doc\facerec\src下找到,當然也可以在他的github中找到,如果你想研究源碼,自然可以去看看,不復雜)
目前支持的演算法有
Eigenfaces特徵臉createEigenFaceRecognizer()
Fisherfaces createFisherFaceRecognizer()
LocalBinary Patterns Histograms局部二值直方圖 createLBPHFaceRecognizer()
下面所有的例子中的代碼在OpenCV安裝目錄下的samples/cpp下面都能找到,所有的代碼商用或者學習都是免費的。
1.2.人臉識別Face
Recognition
對人類來說,人臉識別很容易。文獻[Tu06]告訴我們,僅僅是才三天的嬰兒已經可以區分周圍熟悉的人臉了。那麼對於計算機來說,到底有多難?其實,迄今為止,我們對於人類自己為何可以區分不同的人所知甚少。是人臉內部特徵(眼睛、鼻子、嘴巴)還是外部特徵(頭型、發際線)對於人類識別更有效?我們怎麼分析一張圖像,大腦是如何對它編碼的?David Hubel和TorstenWiesel向我們展示,我們的大腦針對不同的場景,如線、邊、角或者運動這些局部特徵有專門的神經細胞作出反應。顯然我們沒有把世界看成零散的塊塊,我們的視覺皮層必須以某種方式把不同的信息來源轉化成有用的模式。自動人臉識別就是如何從一幅圖像中提取有意義的特徵,把它們放入一種有用的表示方式,然後對他們進行一些分類。基於幾何特徵的人臉的人臉識別可能是最直觀的方法來識別人臉。第一個自動人臉識別系統在[Kanade73]中又描述:標記點(眼睛、耳朵、鼻子等的位置)用來構造一個特徵向量(點與點之間的距離、角度等)。通過計算測試和訓練圖像的特徵向量的歐氏距離來進行識別。這樣的方法對於光照變化很穩健,但也有巨大的缺點:標記點的確定是很復雜的,即使是使用最先進的演算法。一些幾何特徵人臉識別近期工作在文獻[Bru92]中有描述。一個22維的特徵向量被用在一個大資料庫上,單靠幾何特徵不能提供足夠的信息用於人臉識別。
特徵臉方法在文獻[TP91]中有描述,他描述了一個全面的方法來識別人臉:面部圖像是一個點,這個點是從高維圖像空間找到它在低維空間的表示,這樣分類變得很簡單。低維子空間低維是使用主元分析(Principal
Component
Analysis,PCA)找到的,它可以找擁有最大方差的那個軸。雖然這樣的轉換是從最佳重建角度考慮的,但是他沒有把標簽問題考慮進去。[gm:讀懂這段需要一些機器學習知識]。想像一個情況,如果變化是基於外部來源,比如光照。軸的最大方差不一定包含任何有鑒別性的信息,因此此時的分類是不可能的。因此,一個使用線性鑒別(Linear
Discriminant Analysis,LDA)的特定類投影方法被提出來解決人臉識別問題[BHK97]。其中一個基本的想法就是,使類內方差最小的同時,使類外方差最大。
近年來,各種局部特徵提取方法出現。為了避免輸入的圖像的高維數據,僅僅使用的局部特徵描述圖像的方法被提出,提取的特徵(很有希望的)對於局部遮擋、光照變化、小樣本等情況更強健。有關局部特徵提取的方法有蓋伯小波(Gabor
Waelets)([Wiskott97]),離散傅立葉變換(DiscreteCosinus
Transform,DCT)([Messer06]),局部二值模式(LocalBinary
Patterns,LBP)([AHP04])。使用什麼方法來提取時域空間的局部特徵依舊是一個開放性的研究問題,因為空間信息是潛在有用的信息。
1.3.人臉庫Face
Database
我們先獲取一些數據來進行實驗吧。我不想在這里做一個幼稚的例子。我們在研究人臉識別,所以我們需要一個真的人臉圖像!你可以自己創建自己的數據集,也可以從這里(http://face-rec.org/databases/)下載一個。
AT&TFacedatabase又稱ORL人臉資料庫,40個人,每人10張照片。照片在不同時間、不同光照、不同表情(睜眼閉眼、笑或者不笑)、不同人臉細節(戴眼鏡或者不戴眼鏡)下採集。所有的圖像都在一個黑暗均勻的背景下採集的,正面豎直人臉(有些有有輕微旋轉)。
YaleFacedatabase
A ORL資料庫對於初始化測試比較適合,但它是一個簡單的資料庫,特徵臉已經可以達到97%的識別率,所以你使用其他方法很難得到更好的提升。Yale人臉資料庫是一個對於初始實驗更好的資料庫,因為識別問題更復雜。這個資料庫包括15個人(14個男人,1個女人),每一個都有11個灰度圖像,大小是320*243像素。資料庫中有光照變化(中心光照、左側光照、右側光照)、表情變化(開心、正常、悲傷、瞌睡、驚訝、眨眼)、眼鏡(戴眼鏡或者沒戴)。
壞消息是它不可以公開下載,可能因為原來的伺服器壞了。但我們可以找到一些鏡像(比如 theMIT)但我不能保證它的完整性。如果你需要自己剪裁和校準圖像,可以閱讀我的筆記(bytefish.de/blog/fisherfaces)。
ExtendedYale
Facedatabase
B 此資料庫包含38個人的2414張圖片,並且是剪裁好的。這個資料庫重點是測試特徵提取是否對光照變化強健,因為圖像的表情、遮擋等都沒變化。我認為這個資料庫太大,不適合這篇文章的實驗,我建議使用ORL資料庫。
1.3.1. 准備數據
我們從網上下了數據,下了我們需要在程序中讀取它,我決定使用CSV文件讀取它。一個CSV文件包含文件名,緊跟一個標簽。
/path/to/image.ext;0
假設/path/to/image.ext是圖像,就像你在windows下的c:/faces/person0/image0.jpg。最後我們給它一個標簽0。這個標簽類似代表這個人的名字,所以同一個人的照片的標簽都一樣。我們對下載的ORL資料庫進行標識,可以獲取到如下結果:
./at/s1/1.pgm;0
./at/s1/2.pgm;0
...
./at/s2/1.pgm;1
./at/s2/2.pgm;1
...
./at/s40/1.pgm;39
./at/s40/2.pgm;39
想像我已經把圖像解壓縮在D:/data/at下面,而CSV文件在D:/data/at.txt。下面你根據自己的情況修改替換即可。一旦你成功建立CSV文件,就可以像這樣運行示常式序:
facerec_demo.exe D:/data/at.txt
1.3.2 Creating the CSV File
你不需要手工來創建一個CSV文件,我已經寫了一個Python程序來做這事。
[gm:說一個我實現的方法
如果你會cmd命令,或者稱DOS命令,那麼你打開命令控制台。假設我們的圖片放在J:下的Faces文件夾下,可以輸入如下語句:
J:\Faces\ORL>dir /b/s *.bmp > at.txt
然後你打開at.txt文件可能看到如下內容(後面的0,1..標簽是自己加的):
。。。。
J:\Faces\ORL\s1\1.bmp;0
J:\Faces\ORL\s1\10.bmp;0
J:\Faces\ORL\s1\2.bmp;0
J:\Faces\ORL\s1\3.bmp;0
J:\Faces\ORL\s1\4.bmp;0
J:\Faces\ORL\s1\5.bmp;0
J:\Faces\ORL\s1\6.bmp;0
J:\Faces\ORL\s1\7.bmp;0
J:\Faces\ORL\s1\8.bmp;0
J:\Faces\ORL\s1\9.bmp;0
J:\Faces\ORL\s10\1.bmp;1
J:\Faces\ORL\s10\10.bmp;1
J:\Faces\ORL\s10\2.bmp;1
J:\Faces\ORL\s10\3.bmp;1
J:\Faces\ORL\s10\4.bmp;1
J:\Faces\ORL\s10\5.bmp;1
J:\Faces\ORL\s10\6.bmp;1
。。。。
自然還有c++編程等方法可以做得更好,看這篇文章反響,如果很多人需要,我就把這部分的代碼寫出來。(遍歷多個文件夾,標上標簽)
]
特徵臉Eigenfaces
我們講過,圖像表示的問題是他的高維問題。二維灰度圖像p*q大小,是一個m=qp維的向量空間,所以一個100*100像素大小的圖像就是10,000維的圖像空間。問題是,是不是所有的維數空間對我們來說都有用?我們可以做一個決定,如果數據有任何差異,我們可以通過尋找主元來知道主要信息。主成分分析(Principal
Component Analysis,PCA)是KarlPearson (1901)獨立發表的,而 Harold
Hotelling (1933)把一些可能相關的變數轉換成一個更小的不相關的子集。想法是,一個高維數據集經常被相關變數表示,因此只有一些的維上數據才是有意義的,包含最多的信息。PCA方法尋找數據中擁有最大方差的方向,被稱為主成分。
❺ 怎樣使用OpenCV進行人臉識別
不知道你說的人臉識別是識別出來是某個人還是只是在圖像中檢測出人臉。
剛用opencv完成對自己的人臉識別,但是還需要繼續優化。說一下大致步驟吧:
1、首先就是數據的准備,你要從網路上下載一些人臉庫,後面用來訓練人臉識別模型。人臉檢測模型opencv是自帶的,但是識別模型需要自己訓練。下載人臉庫之後需要對人臉進行標記,這是一個繁瑣的工作,不過網上有腳本或型悄薯者自己寫個程序簡化工作量。
2、把數據標記好之後就是opencv的事情。訓練的函數非常簡單。只有下面這三句:
1
2
3
Ptr<FaceRecognizer> model = createEigenFaceRecognizer();
model->train(images, labels);
model->save("MyFacePCAModel.xml");
3、然後打開攝像頭進行人臉檢測,就是框出人臉的位置。人臉檢測模型是opencv自帶的。
1
2
CascadeClassifier cascade;
cascade.load("haarcascade_frontalface_alt.xml");
這是載入的方法。
1
2
3
4
5
6
cascade.detectMultiScale(gray, faces,
1.1, 2, 0
//|CV_HAAR_FIND_BIGGEST_OBJECT
//|CV_HAAR_DO_ROUGH_SEARCH
| CV_HAAR_SCALE_IMAGE,
Size(30, 30));
這是檢測的方法。這里檢測得運蠢到的就是一個一個的人臉的矩形框,然後用畫矩形的方法把它們畫出來就行了。
4、然後就是對檢測到的人臉進行識別了,用我們剛才訓練好的人臉模型。載入:
1
2
Ptr<FaceRecognizer> modelPCA = createEigenFaceRecognizer();
modelPCA->load("卜者MyFacePCAModel.xml");
檢測:
1
2
3
4
5
6
7
8
9
int predictPCA = 0;
if (face.rows >= 120)
{
resize(face, face_test, Size(92, 112));
}
if (!face_test.empty())
{
predictPCA = modelPCA->predict(face_test);
}
如果預測結果等於標記結果,說明識別正確。
大致流程就這樣了,如果你對opencv有了一定的了解,應該能看懂了。沒看懂只能私聊了。
第一次回答這么長,自己都有點不習慣。
❻ android opencv 人臉識別怎麼做
關於Android開發人臉識別,市面上有不少的sdk,不過都不是免費的,離線的更是少。市面上的商用的一般都賣錢了,定製的話很貴,虹軟有離線的,還免費,識別還是挺不錯的。開源的有opencv,不過識別的不是很好,sdk下載地址。
❼ 怎樣使用OpenCV進行人臉識別
很早以前在processing官網中找到吵敏余了Face Detect(這個鏈接需要升滾代理才能打開)這個為拿埋processing提供人臉識別功能的lib,今天終於靜下心來仔細閱讀了它的說明文檔,下面是其基本使用方法說明: 首先下載pFaceDetect.zip,在processing的libraries文件夾中新建一個名為pFaceDetect的文件夾,再將壓縮包內的library文件夾拷貝到這個文件夾中。 其次,Face Detect需要openCV的支持,但並不必須安裝openCV到計算機中,只要把openCV的cxcore100.dll 、cv100.dll 、libguide40.dll 三個文件拷貝到processing根目錄就行了。
pFaceDetect是對PImage對象進行識別,下面的範例中是通過JMyron來獲取視頻,並將像素信息復制到PImage對象中,因此,運行下面的範例還需要安裝JMyron。 重啟processing,新建一個項目並保存,把壓縮包內的data文件夾拷貝到當前項目的存檔目錄中。
不要忘記連接好攝像頭。
❽ 如何在Android中使用OpenCV
1、下載
進入官網下載OpenCV4Android並解壓。
其中,sdk目錄即是我們開發opencv所需要的類庫;samples目錄中存放著若干opencv應用示例(包括人臉檢測等),可為我們進行android下的opencv開發提供參考;doc目錄為opencv類庫的使用說明及api文檔等;而apk目錄則存放著對應於各內核版本的OpenCV_2.4.3.2_Manager_2.4應用安裝包。此應用用來管理手機設備中的opencv類庫,在運行opencv應用之前,必須確保手機中已經安裝了OpenCV_2.4.3.2_Manager_2.4_*.apk,否則opencv應用將會因為無法載入opencv類庫而無法運行(下篇文章會介紹不提前安裝openCV Manager,即可運行openCV的方法)。
2、將OpenCV引入Android Studio
在Android Studio中選擇File->Import Mole,找到OpenCV解壓的路徑,選擇sdk/java文件夾。
3、更新build.gradle信息
在Android Studio中的左上角選擇Project視圖,在oepnCVLibrary2411文件夾里,打開build.gradle(有很多重名的文件,一定找對openCV庫文件下的),修改文件中的1)compileSdkVersion 2)buildToolsVersion 3) minSdkVersion 4)targetSdkVersion,將其內容與app文件夾下的build.gradle中信息相一致。點擊上方提示的黃色提示框內的Try Again進行更新。
4、添加Mole Dependency
右鍵app文件夾,選擇Open Mole Settings,在app mole的Dependencies一欄中,點擊右上角的綠色加號,將openCVLibrary2411添加進去,點擊確定。
5、復制libs文件夾到項目中
在OpenCV的解壓包中,將sdk-->native-->libs文件夾復制,粘貼在Project視圖下app-->src-->main目錄下,並將其重命名為jniLibs。
自此,OpenCV的環境就配置好了。可以將OpenCV-android-sdk-->samples-->tutorial-1-camerapreview中的layout文件,java文件,放入工程中,修改AndroidManifest.xml,添加使用攝像機的許可權,即可測試是否成功了。
❾ Opencv 圖像識別Android實戰(識別撲克牌 4.圖像識別掃盲)
我想來看這篇文章的人大多對機器學習都有一定的了解,我覺得沒有必要非常學術話的解讀這個意義。人的學習目的不就是為了認識更多的事物么,機器學習也是一樣,就是讓計算機通過學習類比來認識更多的事物。
在這里我們是讓計算機認識圖像,要讓計算機認識事物,首先得教他,他學會了自然就認識了,所以我們准備了很多樣本來告訴計算機什麼是方塊,什麼是梅花等等,當樣本足夠多的時候,計算機通過類比自然就能區別它所看到的事物了。
機器學習演算法有很多種,比如KNN,K-means,決策樹,SVM,貝葉斯等,我們通過提取樣本和目標的特徵數據,再應用這些分類演算法達到事物分類的目的,這樣就簡單的完成了一個機器學習的過程。當然機器學習不光用來分類,還有用來完成更多,更復雜的事情,目前圖像識別領域的機器學習,千變萬化的應用其實還是用來分類。所以圖像分類還是圖像識別的最基本,最重要的工作之一。
在任何情況對任何事物分類都需要有分類目標,比如一株植物是什麼科,那麼分類目標是這個植物,樣本自然就是我們已經定義好的各種植物以及植物類別。一個人是誰,我們可以用ta的面部特徵來分類,人臉就是一個需要分類的目標。同樣圖像分類我么首先要找到分類的目標,比如我們需要知道某張圖裡面是否有蘋果,通常情況下我們需要把可能存在蘋果的地方扣下來和蘋果圖片作為對比,通過對比當匹配度達到一定程度時我們就認為被扣下來圖片區域就是蘋果型陪清,這樣的處理過程通常來講叫做圖像分割,是圖像識別中不可或缺的過程,圖像分割的效果直接影響圖像識別的最終效果。為了解決這個過卜前程,人們提出了很多演算法來解決這個問題,在我看來圖像分割任然是一個需要不斷改進技術。碰巧在這個開源項目中用到的圖像分割很簡單,不需要知道太多其中的原理,也可以很好的完成這個任務。
當前圖像識別領域有兩類主要的圖像識別手段;單步法和基於候選區識別。單步法比如yolo演算法,他直接把未知圖片傳入到神經網路,不用查找候選區就可以識別目標物體。基於候選區方法則多一亂李個過程,第一首先找到可能存在某個物體的候選區,第二步把這些候選區和已知的樣本比對,如果匹配達到一定的程度就認為識別到某個物體。
基於候選區的演算法優缺點如下:
更少的樣本,更高效的運行速度,更容易理解的演算法,更廉價的設備,但是有些情況無法用單步法解決或者效果非常差,本開源項目就是用的基於候選區方式來解決問題。
單步法優缺點:
更多的樣本,單步法更多的使用神經網路,對設備性能要求高,能解決更加復雜的問題。
❿ 如何在Android studio中成功運行opencv人臉識別的例子
1.介紹Introction
從OpenCV2.4開始,加入了新的類FaceRecognizer,我們可以使用它便捷地進行人臉識別實驗。本文既介紹代碼使用,又介紹演算法原理。(他寫的源代碼,我們可以在OpenCV的opencv\moles\contrib\doc\facerec\src下找到,當然也可以在他的github中找到,如果你想研究源碼,自然可以去看看,不復雜)
目前支持的演算法有
Eigenfaces特徵臉createEigenFaceRecognizer()
Fisherfaces createFisherFaceRecognizer()
LocalBinary Patterns Histograms局部二值直方圖 createLBPHFaceRecognizer()
下面所有的例子中的代碼在OpenCV安裝目錄下的samples/cpp下面都能找到,所有的代碼商用或者學習都是免費的。
1.2.人臉識別Face
Recognition
對人類來說,人臉識別很容易。文獻[Tu06]告訴我們,僅僅是才三天的嬰兒已經可以區分周圍熟悉的人臉了。那麼對於計算機來說,到底有多難?其實,迄今為止,我們對於人類自己為何可以區分不同的人所知甚少。是人臉內部特徵(眼睛、鼻子、嘴巴)還是外部特徵(頭型、發際線)對於人類識別更有效?我們怎麼分析一張圖像,大腦是如何對它編碼的?David Hubel和TorstenWiesel向我們展示,我們的大腦針對不同的場景,如線、邊、角或者運動這些局部特徵有專門的神經細胞作出反應。顯然我們沒有把世界看成零散的塊塊,我們的視覺皮層必須以某種方式把不同的信息來源轉化成有用的模式。自動人臉識別就是如何從一幅圖像中提取有意義的特徵,把它們放入一種有用的表示方式,然後對他們進行一些分類。基於幾何特徵的人臉的人臉識別可能是最直觀的方法來識別人臉。第一個自動人臉識別系統在[Kanade73]中又描述:標記點(眼睛、耳朵、鼻子等的位置)用來構造一個特徵向量(點與點之間的距離、角度等)。通過計算測試和訓練圖像的特徵向量的歐氏距離來進行識別。這樣的方法對於光照變化很穩健,但也有巨大的缺點:標記點的確定是很復雜的,即使是使用最先進的演算法。一些幾何特徵人臉識別近期工作在文獻[Bru92]中有描述。一個22維的特徵向量被用在一個大資料庫上,單靠幾何特徵不能提供足夠的信息用於人臉識別。