介紹
OpenCV 是一個開源的計算機視覺庫,它提供了許多用于圖像處理和計算機視覺的功能。其中,Haar-cascade 檢測是一種流行的技術,通常用于目標檢測,如人臉、眼睛、手部等。這種方法基于機器學習,使用一系列的矩形特征(Haar 特征)來檢測圖像中的特定對象。
Haar-cascade 檢測的工作原理
-
?Haar 特征?:是一種簡單的矩形特征,用于描述圖像中的局部亮度差異。這些特征對于捕捉邊緣、線條和紋理等圖像結構非常有效。
-
?積分圖?:為了快速計算Haar特征,OpenCV 使用積分圖。積分圖允許我們在常數時間內計算任何矩形區域的像素和。
-
?Cascade 分類器?:一個單獨的Haar特征可能不足以準確檢測目標,因此,通常使用多個特征的組合。Cascade分類器是一個多級的分類器,每一級都包含多個Haar特征。通過逐級過濾,cascade分類器可以有效地減少非目標區域的誤檢,同時保持對目標區域的高檢測率。
-
?訓練?:創建Haar-cascade分類器需要大量的正樣本(包含目標的圖像)和負樣本(不包含目標的圖像)。通過機器學習算法(如Adaboost),可以從這些樣本中學習并生成一個有效的分類器。
程序流程

OpenCV中的Haar人臉檢測
參數說明
1 mage:輸入的圖像,必須是灰度圖,因為Haar特征是基于灰度的。 2 scaleFactor:(可選)在圖像尺寸減小的比例,即每次圖像尺寸減小的比例。默認值為1.1,表示每次窗口尺寸減少10%。調整這個參數可以平衡檢測的精度和速度:較小的scaleFactor值能夠提高檢測的細致程度,但會增加計算負擔;而較大的值則可以減少計算量,加快處理速度,但可能會降低檢測的準確性,從而錯過一些較小或較遠的目標。 3 minNeighbors:(可選)構成檢測目標的相鄰矩形的最小個數。默認值為3,意味著有3個以上的檢測標記存在時,才認為人臉存在。這個參數有助于減少誤檢,即非目標對象被錯誤地識別為目標的情況。設置一個較高的minNeighbors值可以更嚴格地篩選出真正的目標,從而減少誤檢,但同時也有可能將一些真正的目標遺漏,因為它們可能沒有足夠的鄰近矩形滿足條件。 4 flags:(可選)這個參數通常被省略,flags參數用于定義檢測模式,在使用低版本OpenCV時,它可能會被設置為cv2.CASCADE_SCALE_IMAGE,表示在多尺度檢測時調整圖像尺寸。它可以是以下幾個值的組合: 5 CASCADE_DO_ROUGH_SEARCH:快速搜索模式。 6 CASCADE_FIND_BIGGEST_OBJECT:只檢測最大的目標。 7 CASCADE_SCALE_IMAGE:使用縮放圖像進行檢測(默認值)。 8 minSize:(可選)目標的最小尺寸,小于這個尺寸的目標將被忽略。默認為(0, 0),表示沒有限制。 9 maxSize:(可選)目標的最大尺寸,大于這個尺寸的目標將被忽略。默認為(0, 0),表示沒有限制。 10 返回值: 11 12 rects:一個矩形列表,其中每個矩形包含檢測到的對象的坐標和尺寸,格式為(x, y, w, h)。 13 levels:每個檢測到的對象的金字塔層級。 14 scores:每個檢測到的對象的置信度分數。 15 ———————————————— 16 17
在OpenCV中,Haar人臉檢測功能通過CascadeClassifier類實現。首先,需要加載預訓練的Haar特征分類器XML文件,然后使用detectMultiScale方法進行人臉檢測。
1 import cv2 2 import numpy as np 3 4 5 def image_read_from_chinese_path(image_file_name): 6 image_numpy_data = cv2.imdecode(np.fromfile(image_file_name, dtype=np.uint8), 7 -1) # np.fromfile 讀取圖像文件,將其轉換為 NumPy 數組 8 return image_numpy_data 9 10 11 # 級聯分類器路徑(訓練器文件) 12 face_cascade = cv2.CascadeClassifier( 13 r'C:\Users\19225\PycharmProjects\test\src\user\static\haarcascade_frontalcatface.xml') # 人臉檢測的 Haar 級聯分類器XML 文件路徑 14 eye_cascade = cv2.CascadeClassifier( 15 r'C:\Users\19225\PycharmProjects\test\src\user\static\haarcascade_eye_tree_eyeglasses.xml') 16 17 # 讀取圖像 18 img = image_read_from_chinese_path(r'C:\Users\19225\PycharmProjects\test\src\user\static\R.jpg') 19 20 if img is None: 21 print("Image not loaded correctly.") 22 else: 23 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 轉為灰度圖 24 25 # 使用人臉檢測器 face_cascade,在灰度圖像中檢測人臉 26 # scaleFactor:每次圖像尺寸減少的比例,越小越快,檢測效果越好 27 # minNeighbors:最少需要檢測到多少個鄰居,才能確定是人臉,值越大,檢測精度越高 28 # minSize:檢測到的對象的最小尺寸,單位為像素 29 faces = face_cascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=3, minSize=(30, 30), 30 flags=cv2.CASCADE_SCALE_IMAGE) 31 32 for (x, y, w, h) in faces: 33 img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) 34 35 roi_gray = gray[y: y + h, x: x + w] 36 roi_color = img[y: y + h, x: x + w] 37 38 # 檢測眼睛 39 eyes = eye_cascade.detectMultiScale(roi_gray, scaleFactor=1.1, minNeighbors=5, minSize=(15, 15)) 40 41 # 進行非極大值抑制 42 eyes = np.array(eyes) 43 if len(eyes) > 0: 44 boxes = [] 45 for (ex, ey, ew, eh) in eyes: 46 boxes.append((ex, ey, ew, eh)) 47 48 # 自定義合并重疊的框 49 boxes = np.array(boxes) 50 indices = cv2.dnn.NMSBoxes(boxes.tolist(), [1] * len(boxes), score_threshold=0.5, nms_threshold=0.4) 51 52 for i in indices: 53 i = i[0] # 如果是二維數組取第一個元素 54 ex, ey, ew, eh = boxes[i] 55 56 # 防止繪制重復的眼睛 57 cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 0, 255), 2) 58 print(f'Detected {len(eyes)} eyes in face') 59 print(f'Detected {len(faces)} faces') 60 61 label = f'OpenCV Haar Detected {str(len(faces))} faces' 62 cv2.putText(img, label, (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 1) 63 64 cv2.imshow('img', img) 65 cv2.waitKey(0) 66 cv2.destroyAllWindows()

示例二:檢測車牌號
1 # 導入所需庫 2 import cv2 3 import numpy as np 4 5 # 讀取輸入圖像 6 img = cv2.imread(r"C:\Users\19225\PycharmProjects\test\src\user\static\car.jpg") 7 8 # 將輸入圖像轉換為灰度圖像 9 gray = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 10 11 # 讀取檢測車牌的haarcascade 12 cascade = cv2.CascadeClassifier( 13 r'C:\Users\19225\PycharmProjects\test\src\user\static\haarcascade_russian_plate_number.xml') 14 15 # 檢測車牌號碼 16 plates = cascade.detectMultiScale(gray, 1.2, 5) 17 print('Number of detected license plates:', len(plates)) 18 19 # 循環遍歷所有車牌 20 for (x, y, w, h) in plates: 21 # 在車牌周圍繪制邊界矩形 22 cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) 23 gray_plates = gray[y:y + h, x:x + w] 24 color_plates = img[y:y + h, x:x + w] 25 26 # 保存檢測到的車牌 27 cv2.imwrite('Numberplate.jpg', gray_plates) 28 cv2.imshow('Number Plate', gray_plates) 29 cv2.imshow('Number Plate Image', img) 30 cv2.waitKey(0) 31 cv2.destroyAllWindows()

總結
其實OpenCV中已經包含了許多預先訓練好的Haar Cascades分類器,例如用于面部檢測的haarcascade_frontalface_default.xml,以及用于眼睛檢測的haarcascade_eye.xml。這些分類器可以用于快速識別圖像或視頻中的人臉和眼睛。
使用Haar Cascades進行對象檢測的基本流程包括:
加載Haar Cascades分類器XML文件。
讀取圖像并將其轉換為灰度圖像,因為Haar Cascades主要在灰度圖像上工作。
使用detectMultiScale函數在圖像中檢測對象。
根據檢測結果在原始圖像上繪制矩形框或其他標記。
Haar Cascades模型在訓練過程中使用了大量的正負樣本圖像,并經過一系列的訓練和驗證,以達到較好的檢測效果。每個模型都針對特定的目標或特征進行了訓練,并具有其自己的應用場景。選擇適當的模型取決于你的具體應用需求。
如果你需要進行特定的對象檢測任務,例如檢測貓臉、車牌或微笑等,OpenCV同樣提供了相應的Haar Cascades模型。這些模型可能需要根據特定場景進行調整和優化,以提高檢測的準確性和魯棒性[1]。
總的來說,Haar Cascades是一個非常強大且靈活的工具,適用于各種實時對象檢測任務,尤其是在計算機視覺和機器學習領域。
————————————————
原文鏈接:https://blog.csdn.net/yanceyxin/article/details/139726324
各種.xml文件說明
在OpenCV安裝目錄中,具體位置如下:opencv\build\etc\haarcascades(我是摳了其他作者下載在網盤里的xml文件,沒下載opencv)
文件說明
1 haarcascade_eye.xml 2 3 是一個用于眼睛檢測的Haar特征分類器模型,它是OpenCV庫中用于目標檢測任務的預訓練級聯分類器之一。這個XML文件包含了用于檢測圖像或視頻中眼睛的模型參數。通過使用這個XML文件,可以快速實現人眼的自動檢測功能。(我覺得檢測不準確) 4 5 ------------------------------------------------------------------- 6 haarcascade_eye_tree_eyeglasses.xml 7 8 是OpenCV中用于眼睛檢測的Haar Cascades分類器,特別適用于同時檢測眼睛和眼鏡。這個XML文件包含了訓練好的模型參數,能夠識別圖像中的眼睛,即使眼睛上戴著眼鏡也不會影響檢測效果。 9 10 ------------------------------------------------------------------ 11 haarcascade_frontalcatface.xml 12 13 是 OpenCV 中用于貓臉檢測的 Haar Cascades 分類器。這個 XML 文件包含了訓練好的模型參數,專門用于識別圖像中貓的面部特征。如果你正在開發一個應用程序,需要識別和處理貓的圖像,這個分類器可以非常有用。 14 15 ----------------------------------------------------------------- 16 17 haarcascade_frontalcatface_extended.xml 18 19 是 OpenCV 中用于貓臉檢測的擴展版 Haar Cascades 分類器。與基本的 haarcascade_frontalcatface.xml 相比,這個擴展模型可能經過了更多的訓練,以提高在不同條件下貓臉檢測的準確性和魯棒性。它專門用于識別圖像中貓的面部特征,尤其適用于更復雜或更具挑戰性的場景。 20 21 ———————————————— 22 haarcascade_frontalface_alt.xml 23 24 是 OpenCV 中用于人臉檢測的 Haar Cascades 分類器之一。它是一個預訓練的模型,專門設計來識別圖像中的人臉。與 OpenCV 中的默認人臉檢測模型 haarcascade_frontalface_default.xml 相比,haarcascade_frontalface_alt.xml 通常在檢測率上有所提升,但可能會犧牲一些誤檢率。 25 26 ———————————————— 27 haarcascade_frontalface_alt.xml 28 29 是 OpenCV 中用于人臉檢測的 Haar Cascades 分類器之一。它是一個預訓練的模型,專門設計來識別圖像中的人臉。與 OpenCV 中的默認人臉檢測模型 haarcascade_frontalface_default.xml 相比,haarcascade_frontalface_alt.xml 通常在檢測率上有所提升,但可能會犧牲一些誤檢率。 30 31 ———————————————— 32 haarcascade_frontalface_alt_tree.xml 33 34 是 OpenCV 中用于人臉檢測的另一種 Haar Cascades 分類器。這個分類器模型采用了基于樹的分類器結構,它通過組合多個級聯分類器來提高檢測的準確性,特別是在復雜場景下。然而,這種基于樹的方法可能會增加計算時間,因為它需要評估多個分類器。 35 36 --------------------------------------------------------------------------- 37 haarcascade_frontalface_alt2.xml 38 39 這個分類器是 haarcascade_frontalface_alt.xml 的改進版本,旨在保持較高的檢測率的同時,盡可能減少誤檢測。它可能在平衡檢測率和誤檢率方面提供了更好的性能。 40 41 -------------------------------------------------------------------------- 42 haarcascade_frontalface_default.xml 43 44 是一個用于OpenCV庫的XML文件,它包含了一個預先訓練好的Haar特征分類器,用于人臉檢測。這個分類器可以識別圖像中的人臉,是計算機視覺領域中常用的工具之一。如果你需要使用這個文件進行人臉檢測,通常你需要將它加載到OpenCV程序中,然后使用它來處理圖像數據。 45 46 47 ------------------------------------------------------------- 48 haarcascade_fullbody.xml 49 50 包含了一個預先訓練好的Haar特征分類器,專門用于全身人體檢測。這個分類器可以識別圖像或視頻中的整個人體,是計算機視覺領域中用于人體分析的常用工具之一。 51 52 ------------------------------------------ 53 haarcascade_lefteye_2splits.xml 54 55 是OpenCV中用于目標檢測任務的級聯分類器模型文件之一,專門用于檢測圖像或視頻中的左眼 。這個XML文件包含了一個預先訓練好的Haar特征分類器,可以識別和定位左眼的位置。 56 57 ------------------------------------------- 58 haarcascade_license_plate_rus_16stages.xml 59 60 是OpenCV中用于目標檢測任務的級聯分類器模型文件,專門用于檢測俄羅斯車牌。這個XML文件包含了一個預先訓練好的Haar特征分類器,可以識別和定位車牌的位置。 61 62 --------------------------------------------- 63 haarcascade_lowerbody.xml 64 65 是OpenCV中用于目標檢測任務的級聯分類器模型文件,專門用于檢測圖像或視頻中的下半身人體,例如腿部。這個XML文件包含了一個預先訓練好的Haar特征分類器,可以識別和定位下半身人體的位置。 66 67 ----------------------------------------------- 68 haarcascade_profileface.xml 69 70 是OpenCV中用于目標檢測任務的級聯分類器模型文件,專門用于檢測圖像或視頻中的側臉。這個XML文件包含了一個預先訓練好的Haar特征分類器,可以識別和定位側臉的位置。 71 72 73 --------------------------------------- 74 haarcascade_righteye_2splits.xml 75 76 是OpenCV中用于目標檢測任務的級聯分類器模型文件,專門用于檢測圖像或視頻中的右眼。這個XML文件包含了一個預先訓練好的Haar特征分類器,可以識別和定位右眼的位置。這種分類器通常用于面部識別、情緒分析、用戶界面和安全系統等應用中。 77 78 --------------------------------------- 79 haarcascade_russian_plate_number.xml 80 81 是一個用于OpenCV的XML文件,它包含了一個預先訓練好的Haar特征分類器,專門用于檢測俄羅斯車牌號碼。這個分類器可以識別圖像或視頻中的車牌,并在檢測到的車牌區域繪制矩形標記。 82 83 ---------------------------------- 84 haarcascade_smile.xml 85 86 是OpenCV中用于目標檢測任務的級聯分類器模型文件,專門用于檢測圖像或視頻中的微笑。這個XML文件包含了一個預先訓練好的Haar特征分類器,可以識別和定位人臉上微笑的表情。 87 88 ---------------------------------- 89 haarcascade_upperbody.xml 90 91 是OpenCV中用于目標檢測任務的級聯分類器模型文件,專門用于檢測圖像或視頻中的上半身人體,例如頭部和肩部。這個XML文件包含了一個預先訓練好的Haar特征分類器,可以識別和定位上半身人體的位置。
浙公網安備 33010602011771號