How to use opencv (python) to blur faces?

I would like to know if there is a way to blur faces that are automatically identified using the haarcascade face classifier.

Using the code below, I can detect faces, crop the image around this face, or draw a rectangle on it.

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) 

But I would like to blur the face of people so that they are not recognized.

Do you have an idea on how to do this?

thanks for the help

Arno

+8
python opencv
source share
2 answers

I finally managed to do what I want. To do this, apply gaussianblur, as suggested by Hammer. The code:

 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) 

Arno

+16
source share

The whole end of your code can be replaced:

 img[startX:endX, startY:endY] = cv2.blur(img[startX:endX, startY:endY], (23, 23)) 

instead:

  # 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 

Moreover, you do not require a round mask, it (for me) is much easier to read.

PS: sorry for not commenting, not enough reputation to do this. Even if the post is 5 years old, I think it might be worth it as it found for this particular issue ..

+1
source share

All Articles