通过python+opencv识别眼睛,避免误识别

发布时间:2024年01月07日

? ? ? ?我在做视频眼睛识别时,使用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()

? ? ?初学阶段,仅供参考。

文章来源:https://blog.csdn.net/chiyan710710/article/details/135434076
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。