Haar特征分類器就是一個XML文件,存放在OpenCV安裝目錄中的\data\ haarcascades目錄下
- OpenCV中的Haar級聯檢測
OpenCV 自帶了訓練器和檢測器。如果你想自己訓練一個分類器來檢測汽車,飛機等的話,可以使用 OpenCV 構建。其中的細節參考這里:Cascade Classifier Training
現在我們來學習一下如何使用檢測器。OpenCV 已經包含了很多已經訓練好的分類器,其中包括:面部,眼睛,微笑等。這些 XML 文件保存在/opencv/data/haarcascades/文件夾中。下面我們將使用 OpenCV 創建一個面部和眼部檢測器。首先我們要加載需要的 XML 分類器。然后以灰度格式加載輸入圖像或者是視頻。
import sys import cv2 import cv2.cv as cv import numpy as np OPENCV_PATH = r"C:/Program Files/OpenCV2/opencv" # Cascade classifier class for object detection. # Python: cv2.CascadeClassifier(filename) -> CascadeClassifier object # Parameters: filename – Name of the file from which the classifier is loaded. face_cascade = cv2.CascadeClassifier(OPENCV_PATH + '/data/haarcascades/haarcascade_frontalface_default.xml') cap = cv2.VideoCapture("test.avi") # 打開視頻文件 # Returns true if video capturing has been initialized already if not cap.isOpened(): # 檢測視頻是否打開成功 sys.exit() rate=cap.get(cv.CV_CAP_PROP_FPS) # 獲取幀率 delay = int(1000 / rate) # 每一幀之前的延遲與視頻的幀率相對應 while(True): # Capture frame-by-frame ret, frame = cap.read() # Our operations on the frame come here gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Detects objects of different sizes in the input image. # The detected objects are returned as a list of rectangles faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2) # Display the resulting frame cv2.imshow('frame', frame) if cv2.waitKey(delay) & 0xFF == ord('q'): break # Closes video file or capturing device. cap.release() cv2.destroyAllWindows()
下面是對動畫片超級大壞蛋中的一個視頻片段進行人臉檢測:

下面檢測照片(1927年第五屆索爾維會議)中的多個人臉:
import cv2 OPENCV_PATH = r"C:/Program Files/OpenCV2/opencv" face_cascade = cv2.CascadeClassifier(OPENCV_PATH + '/data/haarcascades/haarcascade_frontalface_default.xml') img = cv2.imread('test.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 2) for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) cv2.imshow('image',img) cv2.waitKey(0) cv2.destroyAllWindows()

參考:
