Python 如何使用opencv构建人脸检测程序,并启动计时器记录人脸停留在屏幕上的时间?
我想构建一个人脸检测python OpenCV程序,该程序在检测到人脸后立即启动计时器。如果在网络摄像头前移除人脸,计时器将设置为0,并在检测到新人脸后重新启动 到现在为止,我都试过了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
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()
希望这是你所期望的 首先,计时器没有在后台运行。。。你检测到一张脸,然后简单地开始一个循环,计算一些“秒”。没有检查您的脸是否与以前检测到的脸相同。如果您想在屏幕上显示任何人脸时显示计时器,则只需保存初始时间并打印从该初始时间到现在的时间