OpenCV人脸检测与人脸识别
OpenCV是開源的計(jì)算機(jī)視覺庫,實(shí)現(xiàn)了很多圖像處理和計(jì)算機(jī)視覺方面的通用算法。下面主要OpenCV中的內(nèi)置算法來實(shí)現(xiàn)人臉檢測與人臉識別。
人臉檢測
流程
-  通過OpenCV自帶的級聯(lián)分類器來加載人臉檢測的相關(guān)文件haarcascade_frontalface_default.xml(Windows版路徑為opencv目錄下的\build\etc\haarcascades\) 
-  對圖像進(jìn)行灰度化等預(yù)處理 
-  通過detectMultiScale函數(shù)完成對指定圖片中的人臉進(jìn)行檢測(函數(shù)返回的為臉位置信息) 
-  通過rectangle函數(shù)繪制出人臉位置 
代碼
import?cv2?as?cv import?numpy?as?npdef?face_detect(image):gray?=?cv.cvtColor(image,?cv.COLOR_BGR2GRAY)face_detector?=?cv.CascadeClassifier("haarcascade_frontalface_default.xml")faces?=?face_detector.detectMultiScale(gray,?1.02,?20)for?x,?y,?w,?h?in?faces:cv.rectangle(image,?(x,?y),?(x?+?w,?y?+?h),?(0,?0,?255),?2)cv.imshow("face_detect",?image)def?video_face_detect():capture?=?cv.VideoCapture(0)while?True:ret,?frame?=?capture.read()frame?=?cv.flip(frame,?1)face_detect(frame)c?=?cv.waitKey(10)if?c==27:??#?ESCbreakif?__name__?==?'__main__':src?=?cv.imread("test.jpg")face_detect(src)#?video_face_detect()cv.waitKey(10000)cv.destroyAllWindows()人臉識別
流程:
訓(xùn)練
-  制作人臉數(shù)據(jù)集,格式為:每個類別一個文件夾 
-  通過OpenCV中的face人臉模塊中的EigenFaceRecognizer_create函數(shù)來創(chuàng)建一個模型,并依據(jù)數(shù)據(jù)集完成對模型的訓(xùn)練 
測試
-  利用人臉檢測算法對測試圖片中的人臉進(jìn)行提取 
-  通過模型的predict函數(shù)完成對提取的人臉進(jìn)行識別 
代碼
import?cv2?as?cv import?numpy?as?np import?os import?sysdef?dataset(path):label?=?0imgs,?labels?=?[],?[]for?dirname,?dirnames,?filenames?in?os.walk(path):for?subdirname?in?dirnames:subject_path?=?os.path.join(dirname,?subdirname)for?filename?in?os.listdir(subject_path):filepath?=?os.path.join(subject_path,?filename)im?=?cv.imread(filepath,?cv.IMREAD_GRAYSCALE)im?=?cv.resize(im,?(200,?200))imgs.append(np.asarray(im,?dtype=np.uint8))labels.append(label)label?+=?1return?[imgs,?labels]def?train(imgs,?labels):labels?=?np.asarray(labels,?dtype=np.int32)model?=?cv.face.EigenFaceRecognizer_create()model.train(np.asarray(imgs),?np.asarray(labels))return?modeldef?test(model,?testimg_path):names?=?['joe',?'jane',?'jack',?'Mike']#?每個類別實(shí)際對應(yīng)的名稱,按類別文件夾順序img?=?cv.imread(testimg_path)#人臉檢測face_cascade?=?cv.CascadeClassifier('haarcascade_frontalface_default.xml')faces?=?face_cascade.detectMultiScale(img,?1.1,?1)#對圖片中每個人臉進(jìn)行識別for?(x,?y,?w,?h)?in?faces:img?=?cv.rectangle(img,?(x,y),?(x+w,?y+h),?(255,?0,?0),?2)gray?=?cv.cvtColor(img,?cv.COLOR_BGR2GRAY)roi?=?gray[x:x+w,?y:y+h]roi?=?cv.resize(roi,?(200,?200),?interpolation=cv.INTER_LINEAR)params?=?model.predict(roi)print("label:?%s,?confidence:?%.3f"?%?(params[0],?params[1]))cv.putText(img,?names[params[0]],?(x,?y),?cv.FONT_HERSHEY_SIMPLEX,?1,?255,?2)cv.imshow("img",?img)cv.waitKey(10000)cv.destroyAllWindows()if?__name__?==?'__main__':data_path?=?"數(shù)據(jù)集文件夾根路徑"testimg_path?=?"測試圖片路徑"imgs,?labels?=?dataset(data_path)model?=?train(imgs,?labels)test(model,?testimg_path)總結(jié)
OpenCV中提供的人臉檢測與人臉識別相關(guān)算法缺乏實(shí)用性且人臉識別算法只能對訓(xùn)練集中涉及到的人臉予以識別,所以算法適用場景小。若需更好的人臉識別算法可研究研究FaceNet框架。
總結(jié)
以上是生活随笔為你收集整理的OpenCV人脸检测与人脸识别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Eclipse4.8.0无法打开 Ecl
- 下一篇: 启动优盘怎么做系统 用优盘安装系统步骤
