一:相關依賴文件下載
https://github.com/opencv/opencv
二:實現步驟(圖片檢測)
(一)讀取圖片
image= cv.imread("./d.png") #讀取圖片
(二)灰度轉換
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) #在灰度圖像基礎上實現的
(三)獲取人臉識別訓練數據
face_detector = cv.CascadeClassifier("./haarcascade_frontalface_alt_tree.xml") #級聯檢測器獲取文件
這個xml文件,就是opencv在GitHub上共享出來的具有普適的訓練好的數據。我們可以直接的拿來使用
(四)探測人臉,獲取相關數據
faces = face_detector.detectMultiScale(gray,1.1,2)
#第一個參數是灰度圖像
#第二個參數是尺度變換,就是向上或者向下每次是原來的多少倍,這里是1.02倍
#第三個參數是人臉檢測次數,設置越高,誤檢率越低,但是對於迷糊圖片,我們設置越高,越不易檢測出來,要適當降低
(五)根據相關數據在原圖像上畫出人臉位置
for x,y,w,h in faces: cv.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2) cv.imshow("face_detection",image)
(六)全部代碼
import cv2 as cv import numpy as np def face_detect_demo(image): gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) #在灰度圖像基礎上實現的 face_detector = cv.CascadeClassifier("./haarcascade_frontalface_alt_tree.xml") #級聯檢測器獲取文件 faces = face_detector.detectMultiScale(gray,1.1,2) #在多個尺度空間上進行人臉檢測 #第一個參數是灰度圖像 #第二個參數是尺度變換,就是向上或者向下每次是原來的多少倍,這里是1.02倍 #第三個參數是人臉檢測次數,設置越高,誤檢率越低,但是對於迷糊圖片,我們設置越高,越不易檢測出來,要試單降低 for x,y,w,h in faces: cv.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2) cv.imshow("face_detection",image) src = cv.imread("./d.png") #讀取圖片 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #創建GUI窗口,形式為自適應 cv.imshow("input image",src) #通過名字將圖像和窗口聯系 face_detect_demo(src) cv.waitKey(0) #等待用戶操作,里面等待參數是毫秒,我們填寫0,代表是永遠,等待用戶操作 cv.destroyAllWindows() #銷毀所有窗口
三:實現視頻檢測人臉
步驟相同,我們只需要將視頻中每一幀圖像進行處理,調用上面的圖像人臉檢測即可
import cv2 as cv import numpy as np def face_detect_demo(image): gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) #在灰度圖像基礎上實現的 face_detector = cv.CascadeClassifier("./haarcascade_frontalface_default.xml") #級聯檢測器獲取文件 faces = face_detector.detectMultiScale(gray,1.1,2) #在多個尺度空間上進行人臉檢測 #第一個參數是灰度圖像 #第二個參數是尺度變換,就是向上或者向下每次是原來的多少倍,這里是1.02倍 #第三個參數是人臉檢測次數,設置越高,誤檢率越低,但是對於迷糊圖片,我們設置越高,越不易檢測出來,要試單降低 for x,y,w,h in faces: cv.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2) cv.imshow("face_detection",image) def video_face_detect(): capture = cv.VideoCapture(0) while True: ret,frame = capture.read() #frame是每一幀圖像,ret是返回值,為0是表示圖像讀取完畢 frame = cv.flip(frame,1) if ret == False: break face_detect_demo(frame) c = cv.waitKey(10) if c == 27: break video_face_detect() cv.waitKey(0) #等待用戶操作,里面等待參數是毫秒,我們填寫0,代表是永遠,等待用戶操作 cv.destroyAllWindows() #銷毀所有窗口
相關知識補充:
(一)CascadeClassifier級聯分類器
是Opencv中做人臉檢測的時候的一個級聯分類器
有兩種選擇:一是使用老版本的CvHaarClassifierCascade函數,一是使用新版本的CascadeClassifier類。
老版本的分類器只支持類Haar特征,而新版本的分類器既可以使用Haar,也可以使用LBP特征。
基本原理
xml中存放的是訓練后的特征池,特征size大小根據訓練時的參數而定,檢測的時候可以簡單理解為就是將每個固定size特征(檢測窗口)與輸入圖像的同樣大小區域比較,如果匹配那么就記錄這個矩形區域的位置,然后滑動窗口,檢測圖像的另一個區域,重復操作。
由於輸入的圖像中特征大小不定,比如在輸入圖像中眼睛是50x50的區域,而訓練時的是25x25,那么只有當輸入圖像縮小到一半的時候,才能匹配上,所以這里還有一個逐步縮小圖像,也就是制作圖像金字塔的流程。
cascPath = "./haarcascade_frontalface_default.xml"
cv2.CascadeClassifier(cascPath) #構造方法加載入xml特征文件
detectMultiScale方法
faces = faceCascade.detectMultiScale(gray,1.1,2,30)
def detectMultiScale(self, image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None): # real signature unknown; restored from __doc__
#第一個參數image:是灰度圖像
#第二個參數scaleFactor:是尺度變換,就是向上或者向下每次是原來的多少倍,這里是1.02倍
#第三個參數minNeighbors:是人臉檢測次數,設置越高,誤檢率越低,但是對於迷糊圖片,我們設置越高,越不易檢測出來,要適當降低
#第四個參數flags:
CASCADE_DO_CANNY_PRUNING=1, 利用canny邊緣檢測來排除一些邊緣很少或者很多的圖像區域
CASCADE_SCALE_IMAGE=2, 正常比例檢測 CASCADE_FIND_BIGGEST_OBJECT=4, 只檢測最大的物體
CASCADE_DO_ROUGH_SEARCH=8 初略的檢測
#最后兩個參數用來限制得到的目標區域的范圍
注意:
flags對於新的分類器沒有用
設置minNeighbors:是在人臉附近進行指定次數的檢測,獲取最准確的范圍,設置越高,誤檢率越低,但是對於迷糊圖片,我們設置越高,越不易檢測出來,要適當降低