def build_camera(self): # The location of the face cascade file in the opencv file, used to help identify faces in images or video streams face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_alt.xml') # Read the subfolder name under the dataset name_list = read_name_list('./dataset') # Turn on the camera and start reading cameraCapture = cv2.VideoCapture(700) success, frame = cameraCapture.read() while success and cv2.waitKey(1) == -1: success, frame = cameraCapture.read() # Grayscale image gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Face detection: scaleFactor is #the magnification ratio (this parameter must be greater than 1); #minNeighbors is the number of repeated identifications (this parameter is used to adjust the accuracy, the larger the more accurate) faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=8) for (x, y, w, h) in faces: origin = gray[x:x + w, y:y + h] # origin is the original image, self.img_size is the size of the output image, and interpolation is the interpolation method origin = cv2.resize(origin, (self.img_size, self.img_size), interpolation=cv2.INTER_LINEAR) # Use the model to compare the faces recognized by cv2 label, prob = self.model.predict(origin) # If the model believes that the probability is higher than 70%, it will be displayed as the existing label in the model if prob > 0.7: show_name = name_list[label] else: show_name = 'unknown' # Frame a face frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 1) if prob > 0.7: #storing recognized folder in folder named with date of that day today = datetime.now() recpath = './Recognized/' + today.strftime("%d-%m-%Y") if not os.path.exists(recpath): os.makedirs(recpath) #print(os.getcwd()) cv2.imwrite( recpath + '/' + today.strftime("%H%M%S") + '.jpg', frame[y:y + h, x:x + w]) #if not os.path.exists() # Show name cv2.putText(frame, show_name, (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2) cv2.imshow("Recognizing...", frame) # Release camera cameraCapture.release() # Close all windows cv2.destroyAllWindows()
def test_onePicture(path): # 加载模型 model = Model() model.load() # 读取图片 img = cv2.imread(path) # 重置图片尺寸为:128*128 img = cv2.resize(img, (128, 128)) # 图片灰度化 img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # labelIndex为概率最高的label的索引号, prob为对应概率 labelIndex, prob = model.predict(img) if labelIndex != -1: name_list = read_name_list('./dataset') print(name_list[labelIndex], prob) else: print("Don't know this person.")
def test_onBatch(path): # 加载模型 model = Model() model.load() # 计数器 index = 0 # 读取所有图片;img_list是所有图片的集合,label_lsit是所有标签的集合,label_num是标签数量 img_list, label_lsit, label_num = read_file(path) for img in img_list: # labelIndex为概率最高的label的索引号, prob为对应概率 labelIndex, prob = model.predict(img) if labelIndex != -1: index += 1 name_list = read_name_list('./dataset') print(name_list[labelIndex]) else: print("Don't know this person.") return index
def build_camera(self): # opencv文件中人脸级联文件的位置,用于帮助识别图像或者视频流中的人脸 face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_alt.xml') # 读取dataset数据集下的子文件夹名称,即标签名 name_list = read_name_list('./dataset') # 打开摄像头并开始读取画面 cameraCapture = cv2.VideoCapture('recognize_faces2.mp4') success, frame = cameraCapture.read() while success and cv2.waitKey(1) == -1: success, frame = cameraCapture.read() # 图像灰度化 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 检测人脸:scaleFactor是放大比例(此参数必须大于1);minNeighbors是重复识别次数(此参数用来调整精确度,越大则越精确) faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=8) for (x, y, w, h) in faces: origin = gray[x:x + w, y:y + h] # origin是原图,self.img_size是输出图像的尺寸,interpolation是插值方法 origin = cv2.resize(origin, (self.img_size, self.img_size), interpolation=cv2.INTER_LINEAR) # 利用模型对cv2识别出的人脸进行比对 label, prob = self.model.predict(origin) # 如果模型认为概率高于70%则显示为模型中已有的label if prob > 0.7: show_name = name_list[label] else: show_name = 'unknown' # 框出人脸 frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 1) # 显示人名 cv2.putText(frame, show_name, (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2) cv2.imshow("Recognizing...", frame) # 释放摄像头 cameraCapture.release() # 关闭所有窗口 cv2.destroyAllWindows()
model.load() # 读取图片 image = cv2.imread(path) # 重置图片尺寸为:128*128、512*512 small_image = cv2.resize(image, (128, 128)) # 图片灰度化 small_gray = cv2.cvtColor(small_image, cv2.COLOR_BGR2GRAY) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 检测人脸,探测图片中的人脸 faces = face_engine.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=15) # 读取dataset数据集下的子文件夹名称 name_list = read_name_list('./dataset') # 框出人脸 for (x, y, w, h) in faces: origin = gray[x:x + w, y:y + h] # origin是原图,self.img_size是输出图像的尺寸,interpolation是插值方法 origin = cv2.resize(origin, (128, 128), interpolation=cv2.INTER_LINEAR) # 利用模型对cv2识别出的人脸进行比对 # 第一个返回值为概率最高的label的index,第二个返回值为对应概率 labelIndex, prob = model.predict(origin) # 如果模型认为概率高于70%则显示为模型中已有的label if prob > 0.7: show_name = name_list[labelIndex] else: show_name = 'unknown' # 1.原始图片 2.人脸坐标原点 3.标记的高度 4,线的颜色 5,线宽 frame = cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 1)