Search code examples
pythonopencvmediapipe

How to destroy video feed window and display another image whenever multiple faces are detected using mediapipe


Using OpenCV and Mediapipe to create an application where multiple faces in the live feed is not desired. Hence I require a solution to either destroy video feed and display an image until there is only 1 face in the frame(and display the feed again of course) or Overlay an image on the entire video feed display window(hence hide the feed display)

Here's the code so far:

import cv2
import mediapipe as mp
import time

cap = cv2.VideoCapture(0)
face_detection = mp.solutions.face_detection.FaceDetection(0.8)

mul = cv2.imread('images.png')
mul = cv2.resize(mul, (640, 480))

while True:

    ret, frame = cap.read()
    frame = cv2.resize(frame, (640, 480))
    
    results = face_detection.process(imgRGB)
    
    for count, detection in enumerate(results.detections):
        continue
    count += 1
    
    if count > 1:
        cv2.destroyAllWindows()
        cv2.imshow("output", mul)
        time.sleep(10)
        continue

    cv2.imshow("output", frame)

cap.release()
cv2.destroyAllWindows()

I'm trying to destroy the feed and display. The introduced delay using time.sleep(10) is because without it the windows switch between the video feed and the image at a very high rate, making it hard to see what's happening.

The problem is that image is not being displayed, the window appears blank grey; and after 10 seconds the video feed comes back up and is taking very long to display the image again even though the multiple faces never leave the frame

Thank you


Solution

  • You observe gray frames because you are destroying the window every time loop starts over. You are stucking at the if count > 1: statement since count is being increased for each frame because it does not depend on any condition and never initialize again (so count always >1 after detecting 2 faces although faces are in different frames). Here is my solution to the problem hope it helps.

    import cv2
    import mediapipe as mp
    import time
    
    cap = cv2.VideoCapture(0)
    face_detection = mp.solutions.face_detection.FaceDetection(0.8)
    
    mul = cv2.imread('image.jpg')
    mul = cv2.resize(mul, (640, 480))
    count = 0
    while True:
        ret, frame = cap.read()
        frame = cv2.resize(frame, (640, 480))
        cv2.imshow("Original", frame)
        imgRGB = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        results = face_detection.process(imgRGB)
        if(results.detections):
            for count, detection in enumerate(results.detections):
                count += 1
        print("Number of Faces: ", count)
        if count > 1:
            cv2.imshow('StackOverflow', mul)
        else:
            cv2.imshow('StackOverflow', frame)
        count = 0
    
        if cv2.waitKey(5) & 0xFF == 27:
            break
    
    cap.release()
    cv2.destroyAllWindows()
    

    Here is the result with one face in frame; One person Example

    Result with multiple faces; Multiple Person Example