2013-08-05 29 views
7

Biliyorum ki, haarcascade yüz sınıflandırıcısı tarafından otomatik olarak tanımlanmış olan yüzleri bulanıklaştırmanın bir yolu var.Yüzleri bulanıklaştırmak için opencv (python) nasıl kullanılır?

Aşağıdaki kodu kullanarak, yüzleri algılayabiliyorum, resmi bu yüz etrafında kırpabiliyorum veya üzerine bir dikdörtgen çizebiliyorum.

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) 

Ama insanların yüzünü bulanıklaştırmak, böylece tanınamayacaklarını.

Bunu nasıl yapacağınıza dair bir fikriniz var mı? Yardımlarınız için

Teşekkür

Arnaud

+1

için [bu] (http://docs.opencv.org/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.html) işlevlerinden biri olan geçmesi Resminizin bir alt yüzünü ( – Hammer

+0

Merhaba Çekiç, ) düşündüm ama sadece görüntünün yüzün algılandığı bölümünün nasıl bulanıklaşacağını bilmiyorum. Teşekkürler. –

+0

Nihayet istediğimi yapmaya başlıyorum. 'sub_face = cv2.GaussianBlur (sub_face, (23, 23), 30)' sonra bir yenisine bu görüntü bulanıklığını örtüşen : 'result_image [y bu sizin önerdiğiniz gibi bir gaussianblur uygulamak yapmak için: y + sub_face.shape [0], x: x + sub_face.shape [1]] = alt_yüz ' –

cevap

11

Sonunda istediğini yapmak başardı. Bunun için Hammer'ın önerdiği gibi bir gaussianblur uygulayın. kodudur:

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

Eğer boş bir liste üzerinde yinelemeyen for döngüsü (yüzler!! = 0' ise) gerekmez. aka, her döngü için en üstte etkili bir if ifadesi var. – Kurt

+0

'x, y, w, h = f' daha pythonic – Kurt

İlgili konular