opencv-人脸视频流检测出现的错误
导致错误的代码
#-*- coding:utf-8 -*-
"""
Created on Wen Jan 30 17:19 2019
author:cillian bao
通过haarCascade模型,先进行人脸识别,然后进行眼睛识别
"""
import cv2
#载入人脸识别和眼睛检测的Cascade模型
FaceCascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
EyeCascade=cv2.CascadeClassifier('haarcascade_eye.xml')
#载入视频流
cap=cv2.VideoCapture(1)
#创建一个窗口,名字叫做Video
cv2.namedWindow('Video',flags=cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO | cv2.WINDOW_GUI_EXPANDED)
#图像缩放系数
#why->降低分辨率,可以加快图像识别的速度,提高帧率
scalar=5
while True:
#通过cap对象,一帧一帧读入
ret,frame=cap.read()
if not ret:
print('video end')
break
#获取
height,width,_=frame.shape
#利用resize插值算法,INTER_CUBIC
frame_small=cv2.resize(frame,(int(width/scalar),int(height/scalar)),interpolation=cv2.INTER_CUBIC)
#颜色空间变换,将彩图转换为灰度图
gray=cv2.cvtColor(frame_small,cv2.COLOR_BGR2GRAY)
#检测画面中的人脸
faces=FaceCascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5
)
# 在脸的周围画框框
for (x, y, w, h) in faces:
# 从缩放后的ROI,转换为缩放前的ROI
x *= scalar
y *= scalar
w *= scalar
h *= scalar
# 绘制画面中人脸区域的矩形
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 4)
# 获取脸部区域的ROI图像
# 而且仅需要在脸的上半部分检测眼睛
face_roi = frame[y:y+int(h/2),x:x+w]
# 将ROI图像转换为灰度图
face_gray = cv2.cvtColor(face_roi, cv2.COLOR_BGR2GRAY)
# 检测眼睛
eyes = EyeCascade.detectMultiScale(
face_gray,
scaleFactor=1.1,
minNeighbors=5
)
# 遍历返回的眼睛(eye)对象的ROI
for (ex, ey, ew, eh) in eyes:
# 绘制眼睛的方框
cv2.rectangle(frame, (ex+x, ey+y), (ex+x+ew, ey+y+eh), (0, 0, 255), 4)
# 更新Video窗口下的图像
cv2.imshow('Video', frame)
# 等待按键按下,如果1ms内没有按键的话,就跳过继续执行
# 判断按键是否为q
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.imwrite('cillian_recognition.png',frame)
# 释放VideoCapture
cap.release()
# 关闭所有的窗口
cv2.destroyAllWindows()
导致的错误是由于在导入载入人脸识别和眼睛检测的Cascade模型时,没有导入Opecv自带的Casecade模型
我的是Ubuntu18.04的系统,Cascade模型都在
FaceCascade=cv2.CascadeClassifier('/home/cillian/opencv/data/haarcascades/harrcascade_frontalface_default.xml')
EyeCascade=cv2.CascadeClassifier('/home/cillian/opencv/data/haarcascades/haarcascade_eye.xml')
上面的cillian是我的用户名,设置时要改成你的用户名。
切记,一定要改成opencv自带的文件路径,否则会出错