Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用opencv构建人脸检测程序,并启动计时器记录人脸停留在屏幕上的时间?_Python_Python 3.x_Opencv_Computer Vision_Opencv3.0 - Fatal编程技术网

Python 如何使用opencv构建人脸检测程序,并启动计时器记录人脸停留在屏幕上的时间?

Python 如何使用opencv构建人脸检测程序,并启动计时器记录人脸停留在屏幕上的时间?,python,python-3.x,opencv,computer-vision,opencv3.0,Python,Python 3.x,Opencv,Computer Vision,Opencv3.0,我想构建一个人脸检测python OpenCV程序,该程序在检测到人脸后立即启动计时器。如果在网络摄像头前移除人脸,计时器将设置为0,并在检测到新人脸后重新启动 到现在为止,我都试过了 import numpy as np import cv2 import time face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('h

我想构建一个人脸检测python OpenCV程序,该程序在检测到人脸后立即启动计时器。如果在网络摄像头前移除人脸,计时器将设置为0,并在检测到新人脸后重新启动

到现在为止,我都试过了

import numpy as np
import cv2
import time

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

cap = cv2.VideoCapture(0)

start = "y"
timeLoop = True

while 1:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    for (x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]

        cv2.putText(img, "Number of faces detected: " + str(faces.shape[0]), (0,img.shape[0] -10), cv2.FONT_HERSHEY_TRIPLEX, 0.5,  (0,0,255), 1)

        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex,ey,ew,eh) in eyes:
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

    # Variables to keep track and display
    Sec = 0
    Min = 0        
    # Begin Process
    cv2.imshow('img',img)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

    if len(faces) > 0:  
        timeLoop = start  
        while timeLoop:
            Sec += 1
            print(str(Min) + " Mins " + str(Sec) + " Sec ")
            #cv2.putText(img, "Time: " + str(Min) + " Mins " + str(Sec) + " Sec ", (0,img.shape[0] -10), cv2.FONT_HERSHEY_TRIPLEX, 0.5,  (0,0,255), 1)
            time.sleep(1)
            if Sec == 60:
                Sec = 0
                Min += 1
                print(str(Min) + " Minute")

cap.release()
cv2.destroyAllWindows()
该程序用于人脸检测和定时器。但一旦计时器启动,人脸检测模块就会卡在环路中,无法向前移动。 但是定时器在后台工作


如何解决这个问题?

我想你会喜欢它的。在循环和时间函数的位置上只存在一些小问题

在您的例子中,您在启动计时器时放置了第二个
循环。因此,代码在那里不断循环。这就是为什么(正如@api55所提到的)计时器没有在后台运行。相反,当检测到一张脸时,它开始循环并持续数秒

代码如下:

import numpy as np
import cv2
import time

path = '/Desktop/Stack/face_detection/'

face_cascade = cv2.CascadeClassifier(path + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(path + 'haarcascade_eye.xml')

cap = cv2.VideoCapture(0)

Sec = 0
Min = 0 

while 1:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    for (x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]

        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex,ey,ew,eh) in eyes:
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)     

    if len(faces) > 0:  

        Sec += 1
        print(str(Min) + " Mins " + str(Sec) + " Sec ")

        cv2.putText(img, "Time: " + str(Min) + " Mins " + str(Sec) + " Sec ", (0,img.shape[0] -30), cv2.FONT_HERSHEY_TRIPLEX, 0.5,  (0,0,255), 1)
        cv2.putText(img, "Number of faces detected: " + str(faces.shape[0]), (0,img.shape[0] -10), cv2.FONT_HERSHEY_TRIPLEX, 0.5,  (0,0,255), 1)    

        time.sleep(1)
        if Sec == 60:
            Sec = 0
            Min += 1
            print(str(Min) + " Minute")                

    if len(faces) == 0:

        print('No face detected')
        cv2.putText(img, "No face detected ", (0,img.shape[0] -10), cv2.FONT_HERSHEY_TRIPLEX, 0.5,  (0,0,255), 1)        
        Sec = 0
        Min = 0

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

cap.release()
cv2.destroyAllWindows()
希望这是你所期望的

首先,计时器没有在后台运行。。。你检测到一张脸,然后简单地开始一个循环,计算一些“秒”。没有检查您的脸是否与以前检测到的脸相同。如果您想在屏幕上显示任何人脸时显示计时器,则只需保存初始时间并打印从该初始时间到现在的时间