'if else in a face detector with opencv

Note I am a beginner. I made a script that analyzes a picture and places a box around any faces found in the image, that part works, What i need it to do is change the "faces" in "if faces = True" to something to the effect of If faces found = true, though I don't know what that would be, faces does nothing.

import cv2
import sys
import time

imagePath = sys.argv[1]
cascPath = sys.argv[2]

faceCascade = cv2.CascadeClassifier(cascPath)

image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

faces = faceCascade.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=5,minSize=(30, 30))#,flags = cv2.cv.CV_HAAR_IMAGE_SCALE)

for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

if faces = True:
    cv2.imshow("(1) Pamela Found" ,image)
else:
    cv2.imshow("(0) Pamela's Found" ,image)

cv2.waitKey(0)&0xFF

the code already works it just that the:

if faces = True:
        cv2.imshow("(1) Pamela Found" ,image)
    else:
        cv2.imshow("(0) Pamela's Found" ,image)

doesn't work. Help would be appreciated - Thanks!

Edit: now I have changed the code to look like this:

import cv2
import sys
import time

imagePath = sys.argv[1]
cascPath = sys.argv[2]

faceCascade = cv2.CascadeClassifier(cascPath)

image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

faces = faceCascade.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=5,minSize=(30, 30))#,flags = cv2.cv.CV_HAAR_IMAGE_SCALE)

for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

if faces == True:
    cv2.imshow("(1) Pamela(s) Found" ,image)
    cv2.waitKey(0)&0xFF
else:
    cv2.imshow("(0) Pamela(s) Found" ,image)
    cv2.waitKey(0)&0xFF

When I run this, the XML file and the image without the face, it works, and says, "(0) Pamela(s) Found" as it should, but when I run this, the XML file, and the image with the face the window doesn't pop up, I believe this has to do with the waitkey under the if statement not functioning, help would be appreciated - thanks!



Solution 1:[1]

According to the documentation I found in OpenCV the faceCascade.detectMultiScale return a collection of objects.

To test is a collection (list, set, tuple, dict, etc.) is non-empty, just try:

if faces:
    cv2.imshow("(1) Pamela Found", image)
else:
    cv2.imshow("(0) Pamela's Found", image)

May be a duplicate of Best way to check if a list is empty

Solution 2:[2]

Use faces as the condition:

if faces: # python types can be coerced to boolean
    cv2.imshow("(1) Pamela Found" ,image)
else:
    cv2.imshow("(0) Pamela's Found" ,image)

An empty list (or container) has a falsy value, while if a face was detected (i.e. faces is not empty), the iterable, faces will have a truthy value.


P.S. if faces = True will raise a Syntax error and if you intended if faces == True, that also reduces to, and is better written as if faces.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Community
Solution 2