實現人臉識別性別之路---opencv
import cv2
from make_imge import get_file_name
from train_ph import Model
import os
IMAGE_SIZE = 128
if __name__=="__main__":
name = get_file_name("E:\\gender_image")
model = Model()
model.load()
facecas = cv2.CascadeClassifier("C:\\myword\\haarcascade_frontalface_default.xml")
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret,frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)
faces = facecas.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=3,minSize=(32,32))
if len(faces)>0:
for face in faces:
x,y,w,h = face
cv2.rectangle(frame,(x-10,y-10),(x+w-10,y+h-10),(0,0,255),2)
img =frame[x-10:x+w-10,y-10:y+h-10]
cv2.imwrite("E:\\photo\\"+str(i)+".jpg",img)
cv2.imshow("face_photo",frame)
k = cv2.waitKey(10)
if k == ord("q"):
break
cap.release()
cv2.destroyAllWindows()思路整理:
寫一個截取圖片的代碼為:
1、創建一個識別人臉的對象
2、創建一個攝像頭的對象
3、使用while語句,表示可以讀取很多張圖片
4、判斷攝像頭是否初始化正確,利用read函數返回的ret布爾值進行判斷
5、這裏將圖片變為灰度值
6、判斷正確,通過detectMuitleScale函數把人臉的信息取下來。使用的是灰度值的圖片
7、判斷是否截取到圖片
8、截取到圖片,就將圖片的位置信息讀取出來。圖片是數字信息,每個圖片信息都放在列表中
9、可以在人臉的地方畫一個矩形,根據知道矩形的對角點就可以畫圖像。(這裏的圖象是原圖,沒有進行灰度值轉化的)
10、因為我想要將人臉的這一部分圖像截取下來,因此這裏我通過人臉坐標截取人臉
11、然後我將每一幀的圖片顯示出來
12、如果我不想再顯示圖像的時候,我可以按q結束
13、結束之後,我們就將攝像頭對象釋放然後銷毀所有的窗口
其中每個參數代表的含義:
cv2.CascadeClassifier看參數、用法
Cv2級聯分類器:用於檢測數字圖像的特征
參數:用一個xm文件說明要檢測圖像特征的某一個部分,用xml文件的地址為參數。檢測人臉比較好的參數有:haarcascade_frontalface_alt.xml
cv2.VideoCapture看參數、用法、表示的意義、返回值
視頻捕獲器:是opencv的一個類、利用攝像頭捕獲圖像
參數:可以是:相機的索引值(0:表示打開本地攝像機、1:標售打開別的攝像機);也可以是視頻文件的地址
用法:調用攝像頭的時候
返回值:布爾值
註意Cap是cv2.VideoCapture返回的類
Cap.isOpen():表示是否已經初始化攝像頭
Cap.read():用法、意義、返回值
返回值:返回兩個值:1、ret(布爾值,用來表示讀取幀是否成功)2、frame一個三維矩陣(圖像的數字信息)
用法:ret可以用來判斷圖片是否讀取成功,frame每一幀圖片的矩陣
Face_casade.detectMultilScal():參數的意義、用法、返回值
detectMultilScal為人臉識別器:單單識別人臉
參數:gray,也就是說圖片是灰度的,這樣比較快速
scaleFacetor:默認值為1.1
minNeighbors:默認值為3.表示聯集最小為3,至少有3次重疊檢測,我們才認為人臉確實存
Minsize:最小區域
返回值:得到以人臉特征的數字矩陣的列表
能打開攝像頭的函數為:cv2.imshow():參數、意義、用法
1、圖像寬的名字和每一幀的名字(註意單獨的他是不能把攝像頭調用出來的,因為它顯示的是每一幀的圖片,只是因為讀取一幀的速度很快而已,速度給了我們錯覺)
Cv2.waitkey(delay)函數:參數、作用
作用:不斷刷新圖像,頻率時間為delay,單位為ms
參數:當參數為整數並且大於零是,表示停留多長時間.但參數為0是,表示只顯示一幀
實現人臉識別性別之路---opencv