Skip to content

Instantly share code, notes, and snippets.

@tilfin
Created December 27, 2016 13:18
  • Star 28 You must be signed in to star a gist
  • Fork 11 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save tilfin/98bbba47fdc4ac10c4069cce5fabd834 to your computer and use it in GitHub Desktop.
Face detect and crop by using OpenCV
import cv2
import sys
import os
class FaceCropper(object):
CASCADE_PATH = "data/haarcascades/haarcascade_frontalface_default.xml"
def __init__(self):
self.face_cascade = cv2.CascadeClassifier(self.CASCADE_PATH)
def generate(self, image_path, show_result):
img = cv2.imread(image_path)
if (img is None):
print("Can't open image file")
return 0
#img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = self.face_cascade.detectMultiScale(img, 1.1, 3, minSize=(100, 100))
if (faces is None):
print('Failed to detect face')
return 0
if (show_result):
for (x, y, w, h) in faces:
cv2.rectangle(img, (x,y), (x+w, y+h), (255,0,0), 2)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
facecnt = len(faces)
print("Detected faces: %d" % facecnt)
i = 0
height, width = img.shape[:2]
for (x, y, w, h) in faces:
r = max(w, h) / 2
centerx = x + w / 2
centery = y + h / 2
nx = int(centerx - r)
ny = int(centery - r)
nr = int(r * 2)
faceimg = img[ny:ny+nr, nx:nx+nr]
lastimg = cv2.resize(faceimg, (32, 32))
i += 1
cv2.imwrite("image%d.jpg" % i, lastimg)
if __name__ == '__main__':
args = sys.argv
argc = len(args)
if (argc != 2):
print('Usage: %s [image file]' % args[0])
quit()
detecter = FaceCropper()
detecter.generate(args[1], True)
@suffiyanshaikh
Copy link

Hi sir hope you doing well
i have simulate your code and it is working well your code for crop the face part from the image is very good working with all the images can you give the explanation for the code for the cropping image what logic you have used

@DiMiTriFrog
Copy link

How could I make the face cropped image more big?, for example the 2x square size.

@mohammadkhaleghy
Copy link

hey thanks for this work,
I have a problem with line 19, every time I'll get this error
error: OpenCV(4.1.1) /io/opencv/modules/objdetect/src/cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'detectMultiScale'
any idea?

@lizzie483
Copy link

hey thanks for this work,
I have a problem with line 19, every time I'll get this error
error: OpenCV(4.1.1) /io/opencv/modules/objdetect/src/cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'detectMultiScale'
any idea?

You need to check that the CASCADE_PATH is the correct path of "haarcascade_frontalface_default.xml".

I got the same error before i correctly located the directory path of the .xml file

@mohammadkhaleghy
Copy link

hey thanks for this work,
I have a problem with line 19, every time I'll get this error
error: OpenCV(4.1.1) /io/opencv/modules/objdetect/src/cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'detectMultiScale'
any idea?

You need to check that the CASCADE_PATH is the correct path of "haarcascade_frontalface_default.xml".

I got the same error before i correctly located the directory path of the .xml file

Thanks, it works.

@aniket822
Copy link

Hi Sir, i am trying this code but showing this error

detecter.generate(args[1], True)

IndexError: list index out of range

out of range is showing

@MohammedYaseen97
Copy link

Hi Sir, i am trying this code but showing this error

detecter.generate(args[1], True)

IndexError: list index out of range

out of range is showing

hii .. you have to run the file using the following command :

"python face_cropper.py [your_image_path]"

here, [your_image_path] is a string which contains the location/name of the image you want to crop, which the code takes as args[1] .. you cannot leave that blank

@Tun555
Copy link

Tun555 commented May 7, 2020

hey ammm. i am begining pls tell me . how to run this code in spyder now i can import every module but i can't run anything. it tell IndexError: list index out of range

@aleemahmed96
Copy link

aleemahmed96 commented Oct 29, 2020

For all having problems use this line from documentation and insert on line 7 (don't need to use CASCADE_PATH now; it will automatically detect the path your filesystem has):
Cascade_path is useful only the places where have you deployed the code remotely i.e Docker container, Cloud Services etc

        self.face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")

Documentation Reference: opencv-Pypi

@aleemahmed96
Copy link

hey ammm. i am begining pls tell me . how to run this code in spyder now i can import every module but i can't run anything. it tell IndexError: list index out of range

This is a problem with your image, I suggest you compress the image and then run, I had the same issue and compressed the image to <500kB then it worked.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment