2013-08-05 11 views
7

Mi piacerebbe sapere se c'è un modo per sfocare i volti che sono stati automaticamente identificati dal classificatore faccia haarcascade.Come usare opencv (python) per sfocare i volti?

utilizzando il codice di seguito, sono in grado di rilevare i volti, ritagliare l'immagine attorno a questa faccia o disegnare un rettangolo su di essa.

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) 

Ma vorrei sfocare il volto delle persone in modo che non possano essere riconosciute.

Avete un'idea su come farlo?

Grazie per il vostro aiuto

Arnaud

+1

Utilizzare una delle [queste] funzioni (http://docs.opencv.org/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.html) e passare il subregion della tua immagine contenente una faccia – Hammer

+0

Hi Hammer, Ho pensato a quello, ma non so come sfocare solo la parte dell'immagine in cui è stato rilevato il volto. Grazie. –

+0

Finalmente riesco a fare quello che voglio. Per fare che applicare un gaussianblur come avete suggerito: 'sub_face = cv2.GaussianBlur (sub_face, (23, 23), 30)' poi ho sovrappongono questa immagine sfocatura ad uno nuovo: 'result_image [y: y + sub_face.shape [0], x: x + sub_face.shape [1]] = sub_face' –

risposta

11

ho finalmente riuscito a fare quello che voglio. Per fare ciò, applica un gaussianblur come suggerito da Hammer. Il codice è:

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

Non è necessario 'if len (faces)! = 0', il ciclo for con iterazione su una lista vuota. alias, esiste effettivamente un'istruzione built in all'inizio di ogni ciclo for. – Kurt

+0

'x, y, w, h = f' è più pythonic – Kurt