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