如何在 OpenCV Python 中裁剪和儲存檢測到的面部?


我們可以使用已經訓練好的 Haar 級聯分類器來檢測影像中的面部。為了檢測面部,OpenCV 提供了不同的 Haar 級聯作為 xml 檔案。我們將使用haarcascade_frontalface_alt.xml 來檢測影像中的人臉。檢測到的面部座標為(x,y,w,h) 格式。為了裁剪和儲存檢測到的面部,我們儲存image[y:y+h, x:x+w]

如何下載 Haar 級聯?

您可以訪問以下 GitHub 網站地址找到不同的 Haar 級聯:

https://github.com/opencv/opencv/tree/master/data/haarcascades

要下載用於人臉檢測的 Haar 級聯,請點選haarcascade_frontalface_alt.xml 檔案。以原始格式開啟它,右鍵單擊並儲存檔案。

注意 - 將所有 Haar 級聯 xml 檔案儲存在haarcascade 資料夾中。

步驟

要裁剪並儲存影像中檢測到的面部,您可以按照以下步驟操作:

  • 匯入所需的庫。在以下所有示例中,所需的 Python 庫是OpenCV。確保您已經安裝了它。

  • 使用cv2.imread()讀取輸入影像。指定完整的影像路徑。將輸入影像轉換為灰度。

  • 初始化一個 Haar 級聯分類器物件face_cascade = cv2.CascadeClassifier() 用於面部檢測。傳遞 Haar 級聯 xml 檔案的完整路徑。您可以使用 Haar 級聯檔案haarcascade_frontalface_alt.xml 來檢測影像中的面部。

  • 使用face_cascade.detectMultiScale()檢測輸入影像中的面部。它返回以(x,y,w,h) 格式檢測到的面部座標。

  • 遍歷所有檢測到的面部。找到image[y:y+h, x:x+w] 作為裁剪的面部,並將其賦值給一個新變數,例如face。使用cv2.imwrite()儲存裁剪的面部。

  • 可以選擇顯示裁剪的面部以進行視覺化。

讓我們來看一些例子,以便更好地理解。

示例

在這個例子中,我們使用 Haar 級聯裁剪並儲存輸入影像中檢測到的面部。

# import required libraries import cv2 # read the 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') # detects faces in the input image faces = face_cascade.detectMultiScale(gray, 1.3, 4) print('Number of detected faces:', len(faces)) # loop over all detected faces if len(faces) > 0: for i, (x, y, w, h) in enumerate(faces): # To draw a rectangle in a face cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 255), 2) face = img[y:y + h, x:x + w] cv2.imshow("Cropped Face", face) cv2.imwrite(f'face{i}.jpg', face) print(f"face{i}.jpg is saved") # display the image with detected faces cv2.imshow("image", img) cv2.waitKey(0) cv2.destroyAllWindows()

我們將使用以下影像作為該程式的輸入檔案


執行上述 Python 程式後,將生成以下輸出

Number of detected faces: 1
face0.jpg is saved

我們將得到以下輸出視窗:


示例

在這個 Python 示例中,我們使用 Haar 級聯裁剪並儲存輸入影像中檢測到的面部。

# import required libraries import cv2 # read the input image img = cv2.imread('two-men.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_alt.xml') # detects faces in the input image faces = face_cascade.detectMultiScale(gray, 1.1, 4) print('Number of detected faces:', len(faces)) # loop over all detected faces if len(faces) > 0: for i, (x,y,w,h) in enumerate(faces): # To draw a rectangle in a face cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2) face = img[y:y+h, x:x+w] cv2.imshow(f"Cropped Face {i}", face) cv2.imwrite(f'face{i}.jpg', face) print(f"face{i}.jpg is saved") # display the image with detected faces cv2.imshow("image", img) cv2.waitKey(0) cv2.destroyAllWindows()

我們將使用此影像作為該程式的輸入檔案


執行程式後,將生成以下輸出

Number of detected faces: 2
face0.jpg is saved
face1.jpg is saved

我們將得到以下輸出視窗:


更新於:2022年12月5日

6K+ 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.