2013-08-05 10 views
7

Ich würde gerne wissen, gibt es eine Möglichkeit, die Gesichter zu verwischen, die automatisch von der Haarkaskade Gesicht Klassifikator identifiziert wurden.Wie benutzt man opencv (Python) um Gesichter zu verwischen?

Mit dem unten stehenden Code kann ich die Gesichter erkennen, das Bild um dieses Gesicht zuschneiden oder ein Rechteck darauf zeichnen.

image = cv2.imread(imagepath) 

# Specify the trained cascade classifier 
face_cascade_name = "./haarcascade_frontalface_alt.xml" 

# Create a cascade classifier 
face_cascade = cv2.CascadeClassifier() 

# Load the specified classifier 
face_cascade.load(face_cascade_name) 

#Preprocess the image 
grayimg = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY) 
grayimg = cv2.equalizeHist(grayimg) 

#Run the classifiers 
faces = face_cascade.detectMultiScale(grayimg, 1.1, 2, 0|cv2.cv.CV_HAAR_SCALE_IMAGE, (30, 30)) 

print "Faces detected" 

if len(faces) != 0:   # If there are faces in the images 
    for f in faces:   # For each face in the image 

     # Get the origin co-ordinates and the length and width till where the face extends 
     x, y, w, h = [ v for v in f ] 

     # Draw rectangles around all the faces 
     cv2.rectangle(image, (x,y), (x+w,y+h), (255,255,255)) 
     sub_face = image[y:y+h, x:x+w] 
     for i in xrange(1,31,2): 
      cv2.blur(sub_face, (i,i)) 
     face_file_name = "./face_" + str(y) + ".jpg" 
     cv2.imwrite(face_file_name, sub_face) 

Aber ich möchte das Gesicht der Menschen verwischen, damit sie nicht erkannt werden können.

Haben Sie eine Idee, wie das geht?

Danke für Ihre Hilfe

Arnaud

+1

Verwenden eines von [Diese] (http://docs.opencv.org/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.html) Funktionen und in den Pass Subregion Ihres Bildes mit einem Gesicht – Hammer

+0

Hallo Hammer, Ich dachte, aber ich weiß nicht, wie man nur den Teil des Bildes verwischen, wo das Gesicht erkannt wurde. Danke. –

+0

Endlich gelingt es mir zu tun, was ich will. Um das zu tun ein Weichzeichnen anwenden, wie Sie vorgeschlagen haben: 'sub_face = cv2.GaussianBlur (sub_face, (23, 23), 30)' dann überlappen ich diese Unschärfe Bild auf ein neues: 'result_image [y: y + sub_face.shape [0], x: x + sub_face.shape [1]] = sub_face' –

Antwort

11

gelang es mir endlich zu tun, was ich will. Um das zu tun, wenden Sie einen Gaussianblur an, wie Hammer vorgeschlagen hat. Der Code ist:

image = cv2.imread(imagepath) 
result_image = image.copy() 

# Specify the trained cascade classifier 
face_cascade_name = "./haarcascade_frontalface_alt.xml" 

# Create a cascade classifier 
face_cascade = cv2.CascadeClassifier() 

# Load the specified classifier 
face_cascade.load(face_cascade_name) 

#Preprocess the image 
grayimg = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY) 
grayimg = cv2.equalizeHist(grayimg) 

#Run the classifiers 
faces = face_cascade.detectMultiScale(grayimg, 1.1, 2, 0|cv2.cv.CV_HAAR_SCALE_IMAGE, (30, 30)) 

print "Faces detected" 

if len(faces) != 0:   # If there are faces in the images 
    for f in faces:   # For each face in the image 

     # Get the origin co-ordinates and the length and width till where the face extends 
     x, y, w, h = [ v for v in f ] 

     # get the rectangle img around all the faces 
     cv2.rectangle(image, (x,y), (x+w,y+h), (255,255,0), 5) 
     sub_face = image[y:y+h, x:x+w] 
     # apply a gaussian blur on this new recangle image 
     sub_face = cv2.GaussianBlur(sub_face,(23, 23), 30) 
     # merge this blurry rectangle to our final image 
     result_image[y:y+sub_face.shape[0], x:x+sub_face.shape[1]] = sub_face 
     face_file_name = "./face_" + str(y) + ".jpg" 
     cv2.imwrite(face_file_name, sub_face) 

# cv2.imshow("Detected face", result_image) 
cv2.imwrite("./result.png", result_image) 

Arnaud

+0

Sie müssen nicht 'if len (faces)! = 0', die for-Schleife mit nicht iterieren über eine leere Liste. aka, es gibt effektiv eine eingebaute if-Anweisung am Anfang jeder for-Schleife. – Kurt

+0

'x, y, w, h = f 'ist mehr pythonisch – Kurt

Verwandte Themen