OpenCV3計算機視覺 Python語言實現(4)
2 使用opencv進行人臉檢測和識別
opencv地Haar級聯不具有旋轉不變性
Haar級聯數據來源於data文件中
xml中存放的是訓練後的特徵池,特徵size大小根據訓練時的參數而定,檢測的時候可以簡單理解為就是將每個固定size特徵(檢測窗口)與輸入圖像的同樣大小區域比較,如果匹配那麼就記錄這個矩形區域的位置,然後滑動窗口,檢測圖像的另一個區域,重複操作。由於輸入的圖像中特徵大小不定,比如在輸入圖像中眼睛是50x50的區域,而訓練時的是25x25,那麼只有當輸入圖像縮小到一半的時候,才能匹配上,所以這裡還有一個逐步縮小圖像,也就是製作圖像金字塔的流程。
import cv2filename = face.jpegdef detect(filename): # CascadeClassifier,是Opencv中做人臉檢測的時候的一個級聯分類器,需要data文件夾中 #的xml文件作為輸入 face_cascade = cv2.CascadeClassifier(cascades/haarcascade_frontalface_default.xml) img = cv2.imread(filename) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #調用CascadeClassifier類中的detectMultiScale函數對灰度圖像進行人臉檢測 #輸入參數為scaleFactor和minNeighbors分別表示人臉檢測過程中每次迭代圖像地壓縮率 #以及每個人臉矩形保留近鄰數目的最小值 #輸出為人臉矩形數組 faces = face_cascade.detectMultiScale(gray,1.3,5) for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) cv2.namedWindow(Demo) cv2.imshow(Demo,img) cv2.waitKey() cv2.destroyAllWindows()detect(filename)
import cv2def detect(filename): #不同的配置xml face_cascade = cv2.CascadeClassifier(cascades/haarcascade_frontalface_default.xml) eye_cascade = cv2.CascadeClassifier(cascades/haarcascade_eye.xml) img = cv2.imread(filename) gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #檢測臉 faces = face_cascade.detectMultiScale(gray_img,1.3,5) for (x,y,w,h) in faces: #繪製人臉矩形 cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2) #選擇人臉矩形作為眼睛待檢區域 注意opencv中y是寬,x是高 roi_gray = gray_img[y:y+h,x:x+w] #進行眼睛檢測 #限制眼睛搜索的最小尺寸為40*40像素 eyes = eye_cascade.detectMultiScale(roi_gray,1.03,5,0,(40,40)) #由於得到的坐標為roi_gray坐標,因此需要增加x和y變為img坐標 for (ex,ey,ew,eh) in eyes: cv2.rectangle(img,(ex+x,ey+y),(x+ex+ew,y+ey+eh),(255,0,0),2) cv2.imshow(demo,img) cv2.waitKey() cv2.destroyAllWindows()detect(face3.jpeg)
人臉識別
opencv3有三種人臉識別方法,分別基於Eigenfaces、Fisherfaces以及Local Binary Pattern Histogram(LBPH)
使用Eigenfaces進行識別
import cv2model = cv2.face.createEigenFaceRecognizer()model.train(np.asarray(X),np.asarray(y))params = model.predict(roi)print Label: %s, Confidence: %.2f % (params[0],params[1])
使用Fisherfaces進行識別
model = cv2.face_createFisherFaceRecognizer()
使用LBPH的人臉識別
model = cv2.face.createLBPHFaceRecognizer()
推薦閱讀:
※為什麼C++讀取文件會比Python慢?
※《機器學習實戰》學習總結(七)——支持向量機SVM(2)
※怎麼評價新發布的odoo 11 ?
※Python爬蟲實戰(3):安居客房產經紀人信息採集
TAG:Python |