使用 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
並且我們將獲得以下 **輸出** 視窗: