[英]OpenCV Python face recognition only one face recognition
嗨,大家好,当我运行下面的代码时,我们正在开发一个人脸识别应用程序,正如您在照片中看到的那样,它仅在一个人脸(红色正方形)中起作用,它不扫描转换数据中的其他人脸,我猜我的预测函数只运行一次。 不要在循环中。
处理后的图片: LINK
# coding: utf-8
import cv2
import os
import numpy as np
suclular = ["Bilinmeyen", "Veli Eroglu", "Ali Eroglu"]
def detect_face(img):
# ALGORİMA için Gri Yapıyoruz.
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# yüz tanımlama için geereken haarcascade
face_cascade = cv2.CascadeClassifier(
'opencv-files/lbpcascade_frontalface.xml')
faces = face_cascade.detectMultiScale(
gray, scaleFactor=1.2, minNeighbors=5) # YÜZ TANIMLAMA
for (x, y, w, h) in faces:
img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
if (len(faces) == 0):
return None, None # Yuz bulunamazsa...
(x, y, w, h) = faces[0]
return gray[y:y + w, x:x + h], faces[0]
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
face_recognizer.train(faces, np.array(labels))
def draw_rectangle(img, rect):
(x, y, w, h) = rect
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
def draw_text(img, text, x, y):
cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 0, 255), 2)
def predict(test_img):
img = test_img.copy()
face, rect = detect_face(img)
label, confidence = face_recognizer.predict(face)
print(confidence)
label_text = suclular[label]
if confidence > 42 and confidence < 70:
label_text = "Tespit Edilemedi."
print(label_text)
elif confidence > 70:
label_text = "Bilinmiyor"
draw_rectangle(img, rect)
draw_text(img, label_text, rect[0], rect[1] - 5)
return img
print("Predicting images...")
test_img1 = cv2.imread("test-data/test8jpg.jpg")
predicted_img1 = predict(test_img1)
print("Prediction complete")
cv2.imshow("SONUC", cv2.resize(predicted_img1, (400, 500)))
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)
cv2.destroyAllWindows()
您的预测应该在for循环中使用...即使您遍历每张脸并为每张脸制作一个矩形,您也只能从detect_face
函数返回一张脸,这是最后一张脸。这个:
def predict_face(img):
# ALGORİMA için Gri Yapıyoruz.
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# yüz tanımlama için geereken haarcascade
face_cascade = cv2.CascadeClassifier(
'opencv-files/lbpcascade_frontalface.xml')
faces = face_cascade.detectMultiScale(
gray, scaleFactor=1.2, minNeighbors=5) # YÜZ TANIMLAMA
detected_faces = []
i = 0
for (x, y, w, h) in faces:
img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
detected_face = gray[y:y + w, x:x + h]
label, confidence = face_recognizer.predict(detected_face) # Prediction inside for loop
draw_rectangle(img, faces[i]) # draw the red rectangles for every predicted face
draw_text(img, label, x, y - 5) # draw the predicted label on top of the box
i += 1
为什么要将原始图像传递给predict()
函数? 一旦检测到两个脸部,就应该将它们中的每一个( 使用OpenCV函数从原始图像中提取 )传递给预测函数。 这样,您的算法将可以工作并且更快。
祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.