如何使用OpenCV Python检测图像中的眼睛?
"哈尔级联分类器"是一种有效的基于机器学习的目标检测方法。为了训练用于眼睛检测的哈尔级联分类器,该算法最初需要大量的正样本图像(眼睛图像)和负样本图像(没有眼睛的图像)。然后根据这些正样本和负样本图像训练分类器。然后将其用于检测其他图像中的眼睛。我们可以使用已经训练好的哈尔级联进行眼睛检测。
为了在输入图像中进行眼睛检测,我们需要两个哈尔级联,一个用于人脸检测,另一个用于眼睛检测。我们将使用以下两个哈尔级联:
haarcascade_frontalface_alt.xml
haarcascade_eye_tree_eyeglasses.xml
如何下载Haarcascades?
您可以在以下GitHub网站地址找到不同的haarcascades:
https://github.com/opencv/opencv/tree/master/data/haarcascades要下载用于眼睛检测的哈尔级联,请点击**haarcascade_eye_tree_eyeglasses.xml**文件。以原始格式打开它,右键单击并保存。
**注意** - 将所有haarcascade xml文件保存在**haarcascades**文件夹中。
步骤
要在图像中检测眼睛并在其周围绘制边界框,您可以按照以下步骤操作:
导入所需的库。在以下所有示例中,所需的Python库是**OpenCV**。确保您已安装它。
使用**cv2.imread()**以灰度读取输入图像。指定完整的图像路径。
初始化哈尔级联分类器对象**face_cascade = cv2.CascadeClassifier()**用于人脸检测,以及**eye_cascade = cv2.CascadeClassifier**用于眼睛检测。传递哈尔级联xml文件的完整路径。您可以使用哈尔级联文件**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程序中,我们使用哈尔级联在输入图像中检测眼睛。
# 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
我们将得到以下输出窗口,显示图像中检测到的眼睛:
检测到的眼睛周围的边界框以黄色绘制。