web-dev-qa-db-fra.com

Python + OpenCV: cv2.imwrite

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
14
MashkovtsevLx

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
27
double_g

 enter image description here  enter image description here  enter image description here

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)
1
xtluo