使用 OpenCV 和 Python 进行基于 Haar 级联的微笑检测
我们将使用 Haar 级联分类器来检测图像中的微笑。Haar 级联分类器是一种有效的目标检测方法。它是一种基于机器学习的方法。为了训练用于微笑检测的 Haar 级联分类器,该算法最初需要大量的正样本图像(带有微笑的图像)和负样本图像(没有微笑的图像)。然后从这些正样本和负样本图像中训练分类器。然后将其用于检测其他图像中的微笑。
我们可以使用已经训练好的 Haar 级联进行微笑检测。为了在输入图像中进行微笑检测,我们需要两个 Haar 级联,一个用于人脸检测,另一个用于微笑检测。我们将使用以下两个 Haar 级联:
haarcascade_frontalface_default.xml
haarcascade_smile.xml
如何下载 Haar 级联?
您可以在以下 GitHub 网站地址找到不同的 Haar 级联:
https://github.com/opencv/opencv/tree/master/data/haarcascades要下载微笑 Haar 级联,请点击 **haarcascade_smile.xml** 文件。以原始格式打开它,右键单击并保存。
步骤
要检测图像中的微笑,您可以按照以下步骤操作:
导入所需的库。在以下所有示例中,所需的 Python 库是 **OpenCV**。确保您已安装它。
使用 **cv2.imread()** 读取输入图像。指定完整图像路径。将图像转换为灰度图像。
初始化 Haar 级联分类器对象 **face_cascade = cv2.CascadeClassifier()** 用于人脸检测和 **smile_cascade = cv2.CascadeClassifier** 用于微笑检测。传递 Haar 级联 xml 文件的完整路径。您可以使用 Haar 级联文件 **haarcascade_frontalface_default.xml** 检测图像中的人脸,并使用 **haarcascade_smile.xml** 检测微笑。
使用 **face_cascade.detectMultiScale()** 检测输入图像中的人脸。它以 **(x,y,w,h)** 格式返回检测到的人脸的坐标。
为检测到的人脸定义人脸 **roi** 为 **image[y:y+h, x:x+w]**。现在在检测到的人脸区域(**roi**)内检测微笑。使用 **smile_cascade.detectMultiScale()**。它还以 **(sx,sy,sw,sh)** 格式返回眼睛边界矩形的坐标。
使用 **cv2.rectangle()** 在原始图像中绘制检测到的微笑(嘴巴)周围的边界矩形。
显示带有绘制的嘴巴周围边界矩形的图像。
让我们看一些示例,以便更好地理解。
示例
在这个 Python 程序中,我们使用 Haar 级联在输入图像中执行微笑检测。
# import required libraries import cv2 # read input image img = cv2.imread('smile1.jpg') # convert the image to grayscale gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # read haar cascade for face detection face_cascade = cv2.CascadeClassifier('haarcascades\haarcascade_frontalface_default.xml') # read haar cascade for smile detection smile_cascade = cv2.CascadeClassifier('haarcascades\haarcascade_smile.xml') # Detects faces in the input image faces = face_cascade.detectMultiScale(gray, 1.3, 5) print('Number of detected faces:', len(faces)) # loop over all the faces detected for (x,y,w,h) in faces: # draw a rectangle in a face cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2) cv2.putText(img, "Face", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255), 2) roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] # detecting smile within the face roi smiles = smile_cascade.detectMultiScale(roi_gray, 1.8, 20) if len(smiles) > 0: print("smile detected") for (sx, sy, sw, sh) in smiles: cv2.rectangle(roi_color, (sx, sy), ((sx + sw), (sy + sh)), (0, 0, 255), 2) cv2.putText(roi_color, "smile", (sx, sy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) else: print("smile not detected") # Display an image in a window cv2.imshow('Smile Image',img) cv2.waitKey(0) cv2.destroyAllWindows()
我们将使用此图像作为该程序的 **输入文件**:
输出
执行后,它将产生以下输出:
Number of detected faces: 1 smile detected
并且我们将获得以下 **输出** 窗口: