? ? ? ?我在做视频眼睛识别时,使用haarcascade_eye_tree_eyeglasses.xml级联分类器识别眼睛时,总会出现将鼻孔,嘴巴等类似椭圆形的物体识别成眼睛,且错误率相当高,经过改进之后的算法思路大致如下:
?1、先通过haarcascade_frontalface_default.xml级联分类器进行人脸识别;
2、创立掩模
3、将掩模的x方向设为与脸同宽,y方向1/4h到1/2h之间的区域设为纯白
4、将掩模与原图像做与运算,得到只显示眼睛部位的视频
5、对视频读取的帧用haarcascade_eye_tree_eyeglasses.xml进行眼睛识别
通过以上方法,在视频状态下可以准确的对眼睛进行识别,不会出现是被错误。
源代码如下:
import cv2
import numpy as np
cap=cv2.VideoCapture(0,cv2.CAP_DSHOW) ???#打开摄像头
while(cap.isOpened()): ??????????????????#判断摄像头是否被打开
????ret,frame=cap.read() ????????????????#读取一帧摄像头图像
????#加载脸部识别级联分类器
????face_cascade=cv2.CascadeClassifier("D:/python/BYeyes/Lib/site-packages/haarcascade_frontalface_default.xml")
????#加载眼睛识别级联分类器
????eyes_cascade = cv2.CascadeClassifier("D:/python/BYeyes/Lib/site-packages/haarcascade_eye_tree_eyeglasses.xml")
????faces=face_cascade.detectMultiScale(frame,1.15,5) ???#识别人脸
????for (x, y, w, h) in faces: ??????????????????????#遍历脸部
????????mask=np.zeros(frame.shape,np.uint8) ?????????#创建同原图像一样大小的掩模
????????mask[int(y+h*1/4):int(y+h*1/2),x:int(x+w),:]=255 ?????#将掩模眼睛区域设为白色,其余为黑
????????img=cv2.bitwise_and(frame,mask) ??????????????????????#将掩模与原图像进行与运算,只保留眼睛部分
????????eyes = eyes_cascade.detectMultiScale(img, 1.15, 5) ????#识别眼睛
????????for (x1,y1,w1,h1) in eyes: ????????????????????????????#遍历眼睛
????????????cv2.rectangle(frame,(x1,y1),(x1+w1,y1+h1),(0,255,0),2) ????#将眼睛画上绿色方框
????????????#将瞳孔画上红色方框
????????????cv2.circle(frame,(int(x1+w1*1/2),int(y1+h1*1/2)),5,(0,0,255),2)
????????????cv2.imshow("eyes",frame) ???#在原图像上显示眼睛及瞳孔
????k=cv2.waitKey(1)
????if k==32:
????????cap.release()
????????cv2.destroyAllWindows()
? ? ?初学阶段,仅供参考。