如何使用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
我們將得到以下輸出視窗,顯示影像中檢測到的眼睛:
檢測到的眼睛周圍的邊界框以黃色繪製。