如何在 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
我們將得到以下輸出視窗:

資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP