J'essaie de détecter un visage et d'écrire la zone avec le visage dans un fichier séparé ... Comment puis-je le faire? Je pense que je dois utiliser "faces" (vous pouvez voir cette var dans le code). Mais comment?
from ffnet import mlgraph, ffnet, tmlgraph, imlgraph
import pylab
import sys
import cv,cv2
import numpy
cascade = cv.Load('C:\opencv\data\haarcascades\haarcascade_frontalface_alt.xml')
def detect(image):
bitmap = cv.fromarray(image)
faces = cv.HaarDetectObjects(bitmap, cascade, cv.CreateMemStorage(0))
if faces:
for (x,y,w,h),n in faces:
cv2.rectangle(image,(x,y),(x+w,y+h),(255,255,255),3)
return image
if __== "__main__":
cam = cv2.VideoCapture(0)
while 1:
_,frame =cam.read()
frame = numpy.asarray(detect(frame))
cv2.imshow("features", frame)
if cv2.waitKey(1) == 0x1b: # ESC
print 'ESC pressed. Exiting ...'
break
Ce code suivant doit extraire les faces dans les images et sauvegarder les faces sur le disque.
def detect(image):
image_faces = []
bitmap = cv.fromarray(image)
faces = cv.HaarDetectObjects(bitmap, cascade, cv.CreateMemStorage(0))
if faces:
for (x,y,w,h),n in faces:
image_faces.append(image[y:(y+h), x:(x+w)])
#cv2.rectangle(image,(x,y),(x+w,y+h),(255,255,255),3)
return image_faces
if __== "__main__":
cam = cv2.VideoCapture(0)
while 1:
_,frame =cam.read()
image_faces = []
image_faces = detect(frame)
for i, face in enumerate(image_faces):
cv2.imwrite("face-" + str(i) + ".jpg", face)
#cv2.imshow("features", frame)
if cv2.waitKey(1) == 0x1b: # ESC
print 'ESC pressed. Exiting ...'
break
Alternativement, avec MTCNN et OpenCV (d'autres dépendances, y compris TensorFlow, sont également obligatoires), vous pouvez:
1 Effectuer la détection de visage (Saisir une image, sortir toutes les boîtes de visages détectés):
from mtcnn.mtcnn import MTCNN
import cv2
face_detector = MTCNN()
img = cv2.imread("Anthony_Hopkins_0001.jpg")
detect_boxes = face_detector.detect_faces(img)
print(detect_boxes)
[{'box': [73, 69, 98, 123], 'confidence': 0.9996458292007446, 'keypoints': {'left_eye': (102, 116), 'right_eye': (150, 114), 'nez' : (129, 142), 'mouth_left': (112, 168), 'mouth_right': (146, 167)}}]
2 enregistrer tous les visages détectés dans des fichiers séparés:
for i in range(len(detect_boxes)):
face_img = img[detect_boxes[i]["box"][1]:detect_boxes[i]["box"][1] + detect_boxes[i]["box"][3], detect_boxes[i]["box"][0]:detect_boxes[i]["box"][0] + detect_boxes[i]["box"][2]]
cv2.imwrite("face-%.3d.jpg" % (i+1), face_img)
3 ou Dessinez des rectangles de tous les visages détectés:
for box in detect_boxes:
pt1 = (box["box"][0], box["box"][1]) # top left
pt2 = (box["box"][0] + box["box"][2], box["box"][1] + box["box"][3]) # bottom right
cv2.rectangle(img, pt1, pt2, (0,255,0), 2)
cv2.imwrite("detected-boxes.jpg", img)