-2

I wrote a face detection code but my aim is getting the number of faces detected by haar cascades and printing the number of face on each face. I use face.shape for getting shape of face and it gives the number of face and it's coordinates. Printing the first argument of face.shape gives the total face number. The point is getting number of each faces. Like 1, 2, 3 written on different faces. I need some algorithm about that. Thanks.

Instead of giving - to my posts, come and talk about what's wrong so that I can improve it.

cap = cv2.VideoCapture(0) # Set the camera to use

while True:
    ret, frame = cap.read()    # For image as an input -> frame = cv2.imread(r'C:\Users\ASUS\Desktop\Novumare Technologies\crowded.mp4')
    if ret is True:
        #start_time = time.time()
        frame = cv2.resize(frame, (640, 360))    # Downscale to improve frame rate
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)    # Haar-cascade classifier needs a grayscale image
    else:
        break

    # Capturing and writing on detected bodies
    bodies = body_cascade.detectMultiScale(gray, 1.2, 5)
    for(x, y, w, h) in bodies:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
        cv2.putText(frame, 'Human', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,255), 2)
    # Capturing and writing on detected faces
    faces = face_cascade.detectMultiScale(gray)
    for(ex, ey, ew, eh) in faces:
        cv2.rectangle(frame, (ex, ey), (ex+ew, ey+eh), (0, 0, 255), 2)
        cv2.putText(frame, 'Face #' + str(faces.shape[0]), (ex, ey), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,0), 2)
        print(faces)
        print('------------')
        print(faces.shape)

    # Open here when you save the output -> out.write(frame)
    #end_time = time.time()
    #print("Elapsed time: ", end_time-start_time)
    cv2.putText(frame, "Number of faces detected: " + str(faces.shape[0]), 
    (0,frame.shape[0] -10), cv2.FONT_HERSHEY_TRIPLEX, 0.5,  (0,0,0), 1)
    cv2.imshow('frame', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):   # Exit condition
        break

# Release everything if job is finished
cap.release()
# Open here when you save the output -> out.release()
cv2.destroyAllWindows()
  • welcome to stackoverflow! please take the [tour](http://stackoverflow.com/tour), read up on [how to ask a question](https://stackoverflow.com/help/asking) and provide a [minimal, complete and verifiable example](https://stackoverflow.com/help/mcve) that reproduces your problem. – hiro protagonist Mar 28 '19 at 10:31

1 Answers1

1

Since the total number of faces is len(faces), you may count each number of faces yourself. You can do it with using a face_count.

face_count = 0 # edit it to 1 if you want the number to start with 1
for(ex, ey, ew, eh) in faces:
    cv2.rectangle(frame, (ex, ey), (ex+ew, ey+eh), (0, 0, 255), 2)
    cv2.putText(frame, 'Face #' + str(face_count), (ex, ey), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,0), 2)
    print(faces)
    print('------------')
    print(faces.shape)
    face_count += 1