一、介紹
OpenCV采用的是基于Haar的cascade分類器,它是一種機器學習方法。
基于Haar特征的cascade分類器是Paul Viola和 Michael Jone在2001年發表的論文”Rapid Object Detection using a Boosted Cascade of Simple Features”中提出的一種有效的物品檢測方法。它是一種機器學習方法,通過許多正負樣例中訓練得到cascade模型,然後将其應用于其他圖檔。
二、函數
detectMultiScale()
參數:
1.image表示的是要檢測的輸入圖像
2.objects表示檢測到的人臉目标序列
3.scaleFactor表示每次圖像尺寸減小的比例
4. minNeighbors表示每一個目标至少要被檢測到3次才算是真的目标(因為周圍的像素和不同的視窗大小都可以檢測到人臉),
5.minSize為目标的最小尺寸
6.minSize為目标的最大尺寸
适當調整4,5,6兩個參數可以用來排除檢測結果中的幹擾項
三、步驟
1、初始化,導入cv2等Python庫,加載分類器cascade檔案;
2、圖檔預處理,讀取圖檔,使用cvtColor函數将圖檔轉為灰階圖;
3、人臉檢測,使用detectMultiScale方法檢測圖檔中的人臉。
cascade目錄位置查找
打開cmd,輸入pip show opencv-python
打開目錄
data目錄下是所有的分類器模型檔案
程式示例
1、圖檔識别人臉
import numpy
import cv2
face_cascade = cv2.CascadeClassifier("data/haarcascade_frontalface_default.xml")
#讀取圖檔,使用cvtColor函數将圖檔轉為灰階圖
img = cv2.imread("all.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#檢測圖檔中的人臉
#faces = face_cascade.detectMultiScale(gray, 1.3, 5)
faces = face_cascade.detectMultiScale(gray)
#将人臉部分用長方形表示
print(faces)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),5)
#儲存結果
cv2.imwrite("result.jpg",img)
print("檢測完成,生成結果圖檔\n")
識别結果
2、攝像頭識别人臉
import cv2 as cv
import numpy as np
def face_detect(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
face_detector = cv.CascadeClassifier("lbpcascades/lbpcascade_frontalcatface.xml")
faces = face_detector.detectMultiScale(gray, 1.02, 5)
#faces = face_detector.detectMultiScale(gray)
for x, y, w, h in faces:#給人臉添加矩形框
cv.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)
return image
capture = cv.VideoCapture(0)#其中的0表示電腦中的第一個相機
cv.namedWindow("result", cv.WINDOW_AUTOSIZE)
while (True):
#按幀讀取視訊,ret,frame是獲cap.read()方法的兩個傳回值。其中ret是布爾值,如果讀取幀是正确的則傳回True,如果檔案讀取到結尾,它的傳回值就為False。frame就是每一幀的圖像,是個三維矩陣。
ret, frame = capture.read()
# cv.flip函數表示圖像翻轉,沿y軸翻轉, 0: 沿x軸翻轉, <0: x、y軸同時翻轉
frame = cv.flip(frame, 1)
frame = face_detect(frame)
cv.imshow("result", frame)
#waitKey()方法本身表示等待鍵盤輸入,參數是1,表示延時1ms切換到下一幀圖像,對于視訊而言;
c = cv.waitKey(10)
if c == 27:#當鍵盤按下‘ESC’退出程式
break
#cv.waitKey(0)參數為0,如cv2.waitKey(0)隻顯示目前幀圖像,相當于視訊暫停,;
cv.waitKey(0)
cv.destroyAllWindows()#作用是能正常關閉繪圖視窗
總結
因為沒有設定參數,所有會有一些誤識别,還是識别到了所有人臉