Search code examples
pythonopencvface-recognitiondlibraspberry-pi4

How can i get side view of humans face on opencv by using the facial recognition?


I tried to use Haar cascades called haarcascade_profileface.xml and lbpcascade_profileface.xml together but the camera does not even open at all. How can I fix this issue where I want both haar cascades to work? This is done on the raspberry pi and can also run on Linux and windows as well. Please explain as best as possible! Here is the code:

import numpy as np    

import cv2    

import time    

import RPi.GPIO as GPIO    

GPIO.setmode(GPIO.BCM)    
GPIO.setwarnings(False)    
GPIO.setup(18,GPIO.OUT)    

face_cascade = cv2.CascadeClassifier('Haarcascade_profileface.xml')    

side_face_cascade = cv2.CascadeClassifier('lbpcascade_frontalface_improved.xml')    

prevTime = 0    

## This will get our web camera     

cap = cv2.VideoCapture(0)    

font = cv2.FONT_HERSHEY_SIMPLEX    

while True:    

retval, frame = cap.read()    

if not retval:    
    
break    

_, img = cap.read()              ## This gets each frame from the video, cap.read returns 2 variables flag - indicate frame is correct and 2nd is f    


##img = cv2.imread('Z.png') Then we get our image we want to use    

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)   # This method only works on gray skin images, so we have to convert the gray scale to rgb image    


faces = face_cascade.detectMultiScale(gray, 1.1, 5) ## Next, we detect the faces    

    if len(faces) > 0:    
        print("[INFO] found {0} faces!".format(len(faces)))    
        GPIO.output(18,GPIO.HIGH)    
    else:    
        print("No face")    
        GPIO.output(18,GPIO.LOW)    
    curTime = time.time()    
    sec = curTime - prevTime    
    prevTime = curTime    
    fps = 1/(sec)    
    str = "FPS : %0.1f" % fps     
    for (x, y, w, h) in faces:   ## We draw a rectangle around the faces so we can see it correctly    
        cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0))         ## The faces will be a list of coordinates    
        cv2.putText(img, 'Myface', (x, y), font, fontScale=1, color=(255,70,120),thickness=2)
        side_faces = side_face_cascade.detectMultiScale(gray, 1.1, 5)
        for (ex, ey, ew, eh) in side_faces:   ## We draw a rectangle around the faces so we can see it correctly    
             cv2.rectangle(img, (ex, ey), (ex+ew, ey+eh), (255, 0, 0))         ## The faces will be a list of coordinates    
             cv2.putText(img, 'Myface', (ex, ey), font, fontScale=1, color=(255,70,120),thickness=2)    
    cv2.putText(frame, 'Number of Faces Detected: ' + str, (0,  100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0))    
    cv2.imshow('img', img) ## Last we show the image    
    x = cv2.waitKey(30) & 0xff    
    if x==27:    
        break    
## Press escape to exit the program    
cap.release()    

Solution

  • OpenCV actually provides a "side-face" detector. It is called 'haarcascade_profileface.xml'. You can do:

    side_face_cascade = cv2.CascadeClassifier('haarcascade_profileface.xml')
    side_faces = side_face_cascade.detectMultiScale(gray, 1.1, 5)