Как проверить, не обнаружены ли эти лица с помощью cvlib - PullRequest
0 голосов
/ 09 апреля 2020
Библиотека

cvlib в python хорошо известна, и ее используют многие исследователи. Я заметил, что если threr не обнаружил лица, то (для) l oop останавливается для проверки, если у меня есть следующий код:

cap = cv2.VideoCapture(0)
if not (cap.isOpened()):
    print('Could not open video device')
#To set the resolution
vid_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
vid_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
while(True):
    ret, frame = cap.read()
    if not ret:
        continue
    faces, confidences = cv.detect_face(frame)
    # loop through detected faces and add bounding box
    for face in faces:
        (startX,startY) = face[0],face[1]
        (endX,endY) = face[2],face[3]
        cv2.rectangle(frame, (startX,startY), (endX,endY), (0,255,0), 2)
        crop_img = frame[startY-5:endY-5, startX-5:endX-5]```
        print(faces)
        cv2.imshow('object detected',frame)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()

, так как я печатаю (лица), результат будет примерно таким

[[392, 256, 480, 369]]
[[392, 256, 478, 369]]
[[392, 255, 478, 370]]
.
.
.
[[392, 255, 478, 370]]

Однако, как только я блокирую камеру или отодвигаю голову от нее, так как лицо не обнаружено, for l oop останавливается или приостанавливается до тех пор, пока не увидит обнаруживаемое лицо.

Мне нужно выражение if или любое другое условие, чтобы проверить это замораживание или паузу, чтобы произвести что-то еще.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Я нашел ответ на этот вопрос, если мы добавим оператор if перед формой для l oop, так как face is int, то получится 1,2,3 в зависимости от того, сколько лиц перед камерой.

if len(faces) == 0:
   print('no faces')
   print(faces) # going to print 0
else:
   for face in faces:
       (startX,startY) = face[0],face[1]
       (endX,endY) = face[2],face[3]
       crop_img = frame[startY-5:endY-5, startX-5:endX-5]
       cv2.rectangle(frame, (startX,startY), (endX,endY), (0,255,0), 2)
    cv2.imshow('object detected',frame)

    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()
0 голосов
/ 09 апреля 2020

Вы отображаете только те кадры, где обнаружено лицо. Если лицо не обнаружено, вы видите последний кадр, в котором лицо обнаруживается до следующего обнаружения лица в следующих кадрах.

Переместите imshow из for l oop. Например,

# loop through detected faces and add bounding box
for face in faces:
    (startX,startY) = face[0],face[1]
    (endX,endY) = face[2],face[3]
    cv2.rectangle(frame, (startX,startY), (endX,endY), (0,255,0), 2)
    crop_img = frame[startY-5:endY-5, startX-5:endX-5]
    print(faces)

cv2.imshow('object detected',frame)
k = cv2.waitKey(30) & 0xff
if k == 27:
    break

Оформить полный пример здесь .

...