opencvandroid人臉識別
A. opencv實現一個人臉檢測功能,編譯出的android程序有多大
在python下用起來OpenCV很爽,代碼很簡潔,很清晰易懂。使用的是Haar特徵的分類器,訓練之後得到的數據存在一個xml中。下面我們就來詳細談談。 模式識別課上老師留了個實驗,在VC++環境下利用OpenCV庫編程實現人臉檢測與跟蹤。 然後就開始下載opencv和vs2012,再然後,配置了好幾次還是配置不成功,這里不得不吐槽下微軟,軟體做這么大,這么難用真的好嗎? 於是就嘗試了一下使用python完成實驗任務,大概過程就是這樣子的: 首先,配置運行環境: 下載opencv和python的比較新的版本,推薦opencv2.4.X和python2.7.X。 直接去官網下載就ok了,python安裝時一路next就行,下載的opencv.exe文件運行後基本上是一個解壓的過程,自己選擇一個解壓路徑(盡量不要出現中文),然後就坐等解壓完成。 然後從opencv解壓後的路徑中找(D:My DocumentsDownloads)opencvbuildpython2.7x86,()裡面的部分是你自己的安裝路徑,其中x86對應32位的機器,x64代表64位的機器,當然要按照你機器的實際情況選擇了。將這個路徑裡面的cv2.pyd拷貝至python2.7的模塊路徑C:Python27Libsite-packages里,python2.7默認安裝在C盤跟目錄下。 此時打開python,在cmd下輸入python,或者直接打開“所有程序->active state active python->Python Interactive Shell”都行。 接下來輸入import cv2,出錯了對不對?為什麼呢? 這是因為沒有安裝numpy這個python模塊,去numpy的官網下載一個比較新的版本,因為最新的版本一般都是源代碼,需要去命令行中安裝,比較麻煩,推薦找一個exe文件。注意,在官網給出的鏈接中,切記看完全名稱,後面一般都會提示這個模塊在哪個python版本下安裝時比較和諧,選擇你自己安裝的python版本對應的numpy模塊。下載完成後安裝時看一下該模塊給出的python路徑對不對,對的話然後next就行了,不對的話可能就是你的python是2.7,卻下了numpy for python 3.0. 這時再去import一下cv2,如果什麼也沒有輸出的話就是import成功了。 簡直比vs下的配置簡單了好幾個數量級,對不對? 配置好環境後,跟著opencv嗨起來! 然後在pythonwin或idle(python gui)下新建一個py文件,輸入以下代碼: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import cv2 import numpy as np cv2.namedWindow("test") cap=cv2.VideoCapture(0) success,frame=cap.read() classifier=cv2.CascadeClassifier("haarcascade_frontalface_alt.xml") #確保此xml文件與該py文件在一個文件夾下,否則將這里改為絕對路徑,此xml文件可在D:My 下找到。 while success: success,frame=cap.read() size=frame.shape[:2] image=np.zeros(size,dtype=np.float16) image=cv2.cvtColor(frame,cv2.cv.CV_BGR2GRAY) cv2.equalizeHist(image,image) divisor=8 h,w=size minSize=(w/divisor,h/divisor) faceRects=classifier.detectMultiScale(image,1.2,2,cv2.CASCADE_SCALE_IMAGE,minSize) if len(faceRects)>0: for faceRect in faceRects: x,y,w,h=faceRect cv2.circle(frame,(x+w/2,y+h/2),min(w/2,h/2),(255,0,0)) cv2.circle(frame,(x+w/4,y+h/4),min(w/8,h/8),(255,0,0)) cv2.circle(frame,(x+3*w/4,y+h/4),min(w/8,h/8),(255,0,0)) cv2.rectangle(frame,(x+3*w/8,y+3*h/4),(x+5*w/8,y+7*h/8),(255,0,0)) cv2.imshow("test",frame) key=cv2.waitKey(10) c=chr(key&255) if c in ['q','Q',chr(27)]: break cv2.destroyWindow("test") 為什麼沒有注釋,你恐怕知道下雨天,dir()和help()更配呦。 這段代碼的功能就是對計算機攝像頭拍到的視頻加以處理,使其顯示並追蹤人臉。下圖是運行效果: 最後再說一句,這個過程說起來簡單,但很容易出錯,希望大家能自己找到錯誤的原因,並解決錯誤。如果自己解決不了的話,不妨把問題貼在里,大家來共同解決,共同進步。 以上所述就是本文的全部內容了,希望大家能夠喜歡。
B. 你好,我看你曾經問過將opencv人臉識別的代碼應用到android的手機上的問題,我現在也在做這個東西,求指教
有java版本的opencv編譯包,導入即可。還有我是了一個opencv人臉檢測的sample效果不好,沒用了。
C. 怎樣使用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方法尋找數據中擁有最大方差的方向,被稱為主成分。
D. opencv人臉識別支持android么
當然支持,安卓 ios 都可以
E. android opencv 人臉識別怎麼做
關於Android開發人臉識別,市面上有不少的sdk,不過都不是免費的,離線的更是少。市面上的商用的一般都賣錢了,定製的話很貴,虹軟有離線的,還免費,識別還是挺不錯的。開源的有opencv,不過識別的不是很好,sdk下載地址。
F. 用OpenCV開發人臉識別軟體,用Java好還是用C/C++好
我去年就用opencv開發的android手機端的關於人臉識別的增強現實應用。我可以很明確的告訴你,java的opencv頂多調用攝像頭用,圖像處理都用c++的opencv。對於opencv的開發,不管從開發效率還是執行效率,絕對是c++。java版的opencv想都不要想。
G. 怎樣使用OpenCV進行人臉識別
本程序與例8.9程序比,nzp函數的形參數組長度改為8,函數體中,for語句的循環條件也改為i
首先opencv自帶人臉識別函數,可以識別出人臉,其次,要想識別出是誰,這個得機器學習,訓練!
H. 如何在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維的特徵向量被用在一個大資料庫上,單靠幾何特徵不能提供足夠的信息用於人臉識別。
I. android 人臉識別 opencv
呵呵,我是來回答問題的
J. android 使用opencv人臉識別
恩,不錯,加油