如何使用OpenCV Python检测图像中的眼睛
“haar级联分类器”是一种有效的基于机器学习的物体检测方法。要训练一个用于眼睛检测的haar级联分类器,算法一开始需要大量的正面图像(有眼睛的图像)和负面图像(没有眼睛的图像)。然后,分类器从这些正面和负面图像进行训练。然后,它用于在其他图像中检测眼睛。我们可以使用已经训练好的haar级联进行眼睛检测。
为了在输入图像中进行眼睛检测,我们需要两个haar级联,一个用于脸部检测,另一个用于眼部检测。我们将使用以下两个haar级联:
- haarcascade_frontalface_alt.xml
-
haarcascade_eye_tree_eyeglasses.xml
如何下载Haarcascades
您可以在GitHub网址上找到不同的haarcascades:
https://github.com/opencv/opencv/tree/master/data/haarcascades
要下载用于眼睛检测的haar级联,请点击 haarcascade_eye_tree_eyeglasses.xml 文件。以原始格式打开它,右键点击并保存。
注意 :请将所有haarcascade xml文件保存在 haarcascades 文件夹中。
步骤
要在图像中检测眼睛并绘制边界框,请按照以下步骤进行:
- 导入所需的库。在接下来的所有示例中,所需的Python库是 OpenCV 。确保你已经安装了它。
-
使用 cv2.imread() 以灰度形式读取输入图像。指定完整的图像路径。
-
初始化Haar级联分类器对象 face_cascade = cv2.CascadeClassifier() 用于人脸检测和 eye_cascade = cv2.CascadeClassifier() 用于眼睛检测。传递haar级联xml文件的完整路径。您可以使用haar级联文件 haarcascade_frontalface_alt.xml 来检测图像中的人脸和 haarcascade_eye_tree_eyeglasses.xml 来检测眼睛。
-
使用 face_cascade.detectMultiScale() 在输入图像中检测人脸。它以 (x,y,w,h) 格式返回检测到的人脸的坐标。
-
将 roi 定义为检测到的人脸的区域 image[y:y+h, x:x+w] 。现在在检测到的脸部区域( roi )内检测眼睛。使用 eye_cascade.detectMultiScale() 。它还以 (ex,ey,ew,eh) 格式返回眼睛的边界矩形的坐标。
-
使用 cv2.rectangle() 在原始图像中绘制检测到的眼睛的边界矩形。
-
显示带有绘制的眼睛边界矩形的图像。
让我们来看一些示例,以便更清楚地理解。
示例
在这个Python程序中,我们使用haar级联检测输入图像中的眼睛。
# import required libraries
import cv2
# read input image
img = cv2.imread('woman.jpg')
# convert to grayscale of each frames
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# read the haarcascade to detect the faces in an image
face_cascade = cv2.CascadeClassifier('haarcascades\haarcascade_frontalface_default.xml')
# read the haarcascade to detect the eyes in an image
eye_cascade = cv2.CascadeClassifier('haarcascades\haarcascade_eye_tree_eyeglasses.xml')
# detects faces in the input image
faces = face_cascade.detectMultiScale(gray, 1.3, 4)
print('Number of detected faces:', len(faces))
# loop over the detected faces
for (x,y,w,h) in faces:
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
# detects eyes of within the detected face area (roi)
eyes = eye_cascade.detectMultiScale(roi_gray)
# draw a rectangle around eyes
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,255),2)
# display the image with detected eyes
cv2.imshow('Eyes Detection',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
请将下面的图像视为此程序的 输入文件 −
运行上述Python程序时,会产生以下输出窗口−
Number of detected faces: 1
然后我们获得以下输出窗口,显示图像中检测到的眼睛 –
检测到的眼睛周围的边界框被绘制为黄色。