进行人脸检测前需要调用笔记本的摄像头。
opencv中通过cv2.VideoCapture()来进行摄像头的调用。括号中为0代表调用本机摄像头,为1代表调用usb摄像头。
调用摄像头后,就需要进行人脸的检测,此处需要借助opencv中的CascadeClassifier()函数加载haarcascade_frontalface_alt.xml文件。
之后就是对摄像头得到的每帧视频进行处理,要对它进行灰度转换,再用之前加载得分类器进行人脸检测。使用classfier.detectMultiScale()返回检测到得人脸矩阵的Rect(x,y,w,h),x、y是左上角起始坐标,h、w是高和宽。
将得到的矩阵用cv2.rectangle()画出来。
所有代码如下:
import cv2
def openvideo(window_name ,video_id):
cv2.namedWindow(window_name) # 创建一个窗口
cap=cv2.VideoCapture(video_id) # 获取摄像头
while cap.isOpened():
ok,frame=cap.read() # ok表示摄像头读取状态,frame表示摄像头读取的图像
if not ok :
break
cv2.imshow(window_name,frame) # 将图像矩阵显示在一个窗口中
c=cv2.waitKey(10) # 等待10ms,10ms内没有按键操作就进入下一次while循环,从而得到10ms一帧的效果,waitKey返回在键盘上按的键
if c & 0xFF==ord('q'): # 按键q后break
break
# 释放资源
cap.release()
cv2.destroyWindow(window_name)
print("cam closed")
def facedetect(windowname,camera_id):
cv2.namedWindow(windowname)
cap=cv2.VideoCapture(camera_id,cv2.CAP_DSHOW)
# Face Detection using Haar Cascades http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html?highlight=cascadeclassifier
classfier=cv2.CascadeClassifier('haarcascade_frontalface_alt.xml') # 加载分类器,分类器位置可以自行更改,注意这里用opencv库文件夹下的绝对路径也不行,在库文件夹里找到这个文件复制到这个程序的同目录下,
color=(0,225,0)#人脸框的颜色,采用rgb模型,这里表示g取255,为绿色框
while cap.isOpened():
ok,frame=cap.read() # 读取一帧数据,ok表示摄像头读取状态,frame表示摄像头读取的图像矩阵mat类型
print(ok)
if not ok:
break
# 灰度
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#图像灰度化,cv2.cvtColor(input_image, flag) where flag determines the type of conversion.
# detectMultiScale完成人脸探测工作,returns the positions of detected faces as Rect(x,y,w,h),x、y是左上角起始坐标,h、w是高和宽
# grey是要识别的图像数据,scaleFactor图像缩放比例,可以理解为同一个物体与相机距离不同,其大小亦不同,必须将其缩放到一定大小才方便识别,该参数指定每次缩放的比例
faceRects=classfier.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3,minSize=(32,32)) # 利用分类器检测灰度图像中的人脸矩阵数,1.2和3分别为图片缩放比例和需要检测的有效点数
print(faceRects)
if len(faceRects)>0:#大于0则检测到人脸
for faceRect in faceRects:# 可能检测到多个人脸,用for循环单独框出每一张人脸
x,y,w,h=faceRect#获取框的左上的坐标,框的长宽
cv2.rectangle(frame,(x-10,y-10),(x+w-10,y+h-10),color,2)
cv2.imshow(windowname,frame) # 显示图像
c=cv2.waitKey(10)
if c&0xFF==27: # 退出条件
break
cap.release()#释放摄像头并销毁所有窗口
cv2.destroyAllWindows()
print ('open camera...')
# openvideo('mycam' ,0)
facedetect('facedetect',0)