webentwicklung-frage-antwort-db.com.de

Python + OpenCV: cv2.imwrite

Ich versuche, ein Gesicht zu erkennen und den Bereich mit dem Gesicht in einer separaten Datei aufzuschreiben. Wie kann ich das tun? Ich denke, dass ich "Gesichter" verwenden muss (Sie können diese var im Code sehen). Aber wie?

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

Dieser folgende Code sollte Gesichter in Bildern extrahieren und Gesichter auf der Festplatte speichern

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

Alternativ, mit MTCNN und OpenCV (andere Abhängigkeiten einschließlich TensorFlow sind auch erforderlich) können Sie:

1 Gesichtserkennung durchführen (Geben Sie ein Bild ein, geben Sie alle Felder der erkannten Gesichter aus):

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], 'Vertrauen': 0,9996458292007446, 'Schlüsselpunkte': {'left_eye': (102, 116), 'right_eye': (150, 114), 'Nase' : (129, 142), 'mouth_left': (112, 168), 'mouth_right': (146, 167)}}]

2 alle erkannten Gesichter in separaten Dateien speichern:

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 oder Zeichne Rechtecke aller erkannten Gesichter:

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

wtluo, großartig! Darf ich eine geringfügige Änderung Ihres Codes 2 vorschlagen? Hier ist es:

for i, detected_box in enumerate(detect_boxes):
    box = detected_box["box"]
    face_img = img[ box[1]:box[1] + box[3], box[0]:box[0] + box[2] ]
    cv2.imwrite("face-{:03d}.jpg".format(i+1), face_img)
0
Schmouk