haar級聯分類器--人臉檢測和匹配
阿新 • • 發佈:2018-12-31
程式碼:
import numpy as np import cv2 # 例項化人臉分類器 face_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml') # 例項化眼睛分類器 eye_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_eye.xml') # 讀取測試圖片 img = cv2.imread('faces.jpg',cv2.IMREAD_COLOR) # 將原彩色圖轉換成灰度圖 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 開始在灰度圖上檢測人臉,輸出是人臉區域的外接矩形框 faces = face_cascade.detectMultiScale(gray, 1.2, 8) # 遍歷人臉檢測結果 for (x,y,w,h) in faces: # 在原彩色圖上畫人臉矩形框 cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) # 獲取該人臉矩形框的感興趣區域RoI, 淺複製 roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] # 開始在人臉區域中檢測眼睛,輸出是眼睛區域的外接矩形框 eyes = eye_cascade.detectMultiScale(roi_gray) # 遍歷眼睛檢測結構 for (ex,ey,ew,eh) in eyes: # 在原彩色圖上畫眼睛矩形框 cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) # 顯示畫好矩形框的圖片 cv2.namedWindow('faces', cv2.WINDOW_AUTOSIZE) cv2.imshow('faces',img) # 等待退出鍵 cv2.waitKey(0) # 銷燬顯示視窗 cv2.destroyAllWindows()
模板檢測:
import cv2 import numpy as np # 讀取圖片,彩色模式 img_color = cv2.imread('faces.jpg',cv2.IMREAD_COLOR) # 讀取圖片,灰度模式 img_gray = cv2.imread('faces.jpg',cv2.IMREAD_GRAYSCALE) # 讀取人臉模板圖片,灰度模式 template = cv2.imread('face_template1.jpg',cv2.IMREAD_GRAYSCALE) # 獲取模板尺寸 w, h = template.shape[::-1] # 模板匹配方法陣列 methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR', 'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED'] # 遍歷匹配方法 for meth in methods: # 拷貝圖片 img_color2 = img_color.copy() img_gray2 = img_gray.copy() # 把字串轉換成程式碼 method = eval(meth) # 模板匹配 res = cv2.matchTemplate(img_gray2,template,method) # 獲取匹配結果的最大、最小值,及其位置 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # TM_SQDIFF 和 TM_SQDIFF_NORMED匹配方法:值越小,越相似 if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]: # 取最小值位置,作為矩形框左上角位置 top_left = min_loc else: # 取最大值位置,作為矩形框左上角位置 top_left = max_loc # 根據模板尺寸計算出:矩形框右下角位置 bottom_right = (top_left[0] + w, top_left[1] + h) # 畫矩形框 cv2.rectangle(img_color2,top_left, bottom_right, 255, 2) # 顯示畫好矩形框的圖片 cv2.namedWindow(meth, cv2.WINDOW_AUTOSIZE) cv2.imshow(meth,img_color2) # 等待退出鍵 cv2.waitKey(0) # 銷燬顯示視窗 cv2.destroyAllWindows()