2013-08-05 16 views
7

Chciałbym wiedzieć, że istnieje sposób na rozmycie twarzy, które zostały automatycznie zidentyfikowane przez klasyfikator twarzy haarcascade.Jak używać opencv (python) do rozmycia twarzy?

używając poniższego kodu, jestem w stanie wykryć twarze, przyciąć obraz wokół tej twarzy lub narysować na niej prostokąt.

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) 

Ale chciałbym zatrzeć twarz ludzi, aby nie można było ich rozpoznać.

Czy masz pomysł, jak to zrobić?

Dzięki za pomoc

Arnaud

+1

Korzystanie z [tych] Funkcje (http://docs.opencv.org/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.html) i przechodzą w podregion twojego zdjęcia zawierający twarz – Hammer

+0

Witaj młotku, Zastanowiłem się, ale nie wiem, jak zamazać jedynie część obrazu, w której wykryto twarz. Dzięki. –

+0

W końcu udało mi się zrobić to, co chcę. W tym celu stosuje się gaussianblur jak masz sugerowane: 'sub_face = cv2.GaussianBlur (sub_face (23, 23), 30)' potem pokrywają ten brak ostrości obrazu na nowy: 'result_image [Y: y + sub_face.shape [0], x: x + sub_face.shape [1]] = sub_face' –

Odpowiedz

11

I wreszcie udało się zrobić to, co chcę. Aby to zrobić, zastosuj gaussianblur, tak jak zasugerował Hammer. Kod jest:

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

Nie musisz 'if len (faces)! = 0', pętla for nie iteruje nad pustą listą. aka, jest efektywnie wbudowana instrukcja if na górze każdej pętli for. – Kurt

+0

'x, y, w, h = f' jest bardziej pythonic – Kurt