1. OpenCV 級(jí)聯(lián)分類器的基本原理
基于Haar特征的級(jí)聯(lián)分類器的目標(biāo)檢測(cè)是Paul Viola和Michael Jones在2001年的論文中提出的一種有效的目標(biāo)檢測(cè)方法。這是一種基于機(jī)器學(xué)習(xí)的方法,從大量的正面和負(fù)面圖像中訓(xùn)練級(jí)聯(lián)函數(shù)。然后用它來檢測(cè)其他圖像中的物體。
Haar特征是一種反映圖像的灰度變化的,像素分模塊求差值的一種特征。它分為三類:邊緣特征、線性特征、中心特征和對(duì)角線特征。就像卷積核一樣。每個(gè)特征都是一個(gè)單獨(dú)的值,由黑色矩形下的像素和減去白色矩形下的像素和得到。用黑白兩種矩形框組合成特征模板,在特征模板內(nèi)用 黑色矩形像素和減去白色矩形像素和來表示這個(gè)模版的特征值。
例如:臉部的一些特征能由矩形模塊差值特征簡(jiǎn)單的描述,如:眼睛要比臉頰顏色要深,鼻梁兩側(cè)比鼻梁顏色要深,嘴巴比周圍顏色要深等。但矩形特征只對(duì)一些簡(jiǎn)單的圖形結(jié)構(gòu),如邊緣、線段較敏感,所以只能描述在特定方向(水平、垂直、對(duì)角)上有明顯像素模塊梯度變化的圖像結(jié)構(gòu)。這樣就可以進(jìn)行區(qū)分人臉。
級(jí)聯(lián)分類器(Cascade Classifier)是一種用于目標(biāo)檢測(cè)的機(jī)器學(xué)習(xí)模型,通常用于識(shí)別靜態(tài)圖像或視頻流中的特定對(duì)象或物體。級(jí)聯(lián)分類器的一個(gè)重要應(yīng)用是人臉檢測(cè)。
級(jí)聯(lián)分類器基于強(qiáng)分類器的級(jí)聯(lián)結(jié)構(gòu),其中每個(gè)強(qiáng)分類器都是由多個(gè)弱分類器組成的。弱分類器是一種簡(jiǎn)單而不太準(zhǔn)確的分類器,但通過級(jí)聯(lián)結(jié)構(gòu)及其組合,可以達(dá)到高效且精確的目標(biāo)檢測(cè)效果。
2. 級(jí)聯(lián)分類器CascadeClassifier檢測(cè)的基本原理:
Haar特征分類器就是一個(gè)XML文件,用于存儲(chǔ)檢測(cè)特征,xml中存放的是訓(xùn)練后的特征池,特征size大小根據(jù)訓(xùn)練時(shí)的參數(shù)而定,檢測(cè)的時(shí)候可以簡(jiǎn)單理解為就是將每個(gè)固定size特征(檢測(cè)窗口)與輸入圖像的同樣大小區(qū)域比較,如果匹配那么就記錄這個(gè)矩形區(qū)域的位置,然后滑動(dòng)窗口,檢測(cè)圖像的另一個(gè)區(qū)域,重復(fù)操作。由于輸入的圖像中特征大小不定,比如在輸入圖像中眼睛是50x50的區(qū)域,而訓(xùn)練時(shí)的是25x25,那么只有當(dāng)輸入圖像縮小到一半的時(shí)候,才能匹配上,所以這里還有一個(gè)逐步縮小圖像,也就是制作圖像金字塔的流程。
利用Opencv自帶的Haar特征分類器進(jìn)行人臉檢測(cè),該文件中會(huì)描述人體各個(gè)部位的Haar特征值。包括人臉、眼睛、嘴唇等等。Haar特征分類器存放目錄:OpenCV安裝目錄中的\data\ haarcascades目錄下。
3. 靜態(tài)圖中車輛識(shí)別
from PIL import Image
import cv2
import numpy as np
image = Image.open('V1.png')
w,h = image.size
#image = image.resize((int(w/2),int(h/2)))
image_arr = np.array(image)
image
grey = cv2.cvtColor(image_arr,cv2.COLOR_BGR2GRAY)
dilated = cv2.dilate(blur,np.ones((3,3)))
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2, 2))
closing = cv2.morphologyEx(dilated, cv2.MORPH_CLOSE, kernel)
Image.fromarray(closing)
car_cascade_src = 'haarcascade_car.xml'
car_cascade = cv2.CascadeClassifier(car_cascade_src)
cars = car_cascade.detectMultiScale(closing, 1.1, 1)
cnt = 0
for (x,y,w,h) in cars:
cv2.rectangle(image_arr,(x,y),(x+w,y+h),(255,0,0),2)
cnt += 1
print(cnt, " cars found")
Image.fromarray(image_arr)
21 cars found
4. 動(dòng)態(tài)視頻中車輛識(shí)別
import cv2
import numpy as np
car_classifier= cv2.CascadeClassifier('haarcascade_car.xml')
cap= cv2.VideoCapture('cars.avi')
while True:
ret, frame= cap.read()
if ret:
#frame= cv2.resize(frame, None, fx= 0.5, fy= 0.5, interpolation= cv2.INTER_LINEAR)
gray= cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cars= car_classifier.detectMultiScale(gray,1.2,3)
for (x,y,w,h) in cars:
cv2.rectangle(frame,(x,y),(x+w,y+h), (0,255,255),2)
cv2.imshow('Cars', frame)
else:
print('warning: video is not load correctly or the video is finished')
break
key = cv2.waitKey(1) #每一幀圖像就顯示一毫秒就可以,然后繼續(xù)循環(huán)
if key == 27: #27是esc的ascall碼
break
cap.release()
cv2.destroyAllWindows()
5. 關(guān)鍵OpenCV函數(shù)說明
cv2.CascadeClassifier.detectMultiScale() 函數(shù)介紹
在 OpenCV 中,人臉檢測(cè)使用的是 cv2.CascadeClassifier.detectMultiScale()函數(shù),它可以檢
測(cè)出圖片中所有的人臉。該函數(shù)由分類器對(duì)象調(diào)用,其語(yǔ)法格式為:
objects = cv2.CascadeClassifier.detectMultiScale( image[,
scaleFactor[, minNeighbors[, flags[, minSize[, maxSize]]]]] )
式中各個(gè)參數(shù)及返回值的含義為:
- image:待檢測(cè)圖像,通常為灰度圖像。
- scaleFactor:表示在前后兩次相繼的掃描中,搜索窗口的縮放比例。
- minNeighbors:表示構(gòu)成檢測(cè)目標(biāo)的相鄰矩形的最小個(gè)數(shù)。默認(rèn)情況下,該值為 3,意味著有 3 個(gè)以上的檢測(cè)標(biāo)記存在時(shí),才認(rèn)為人臉存在。如果希望提高檢測(cè)的準(zhǔn)確率,可以將該值設(shè)置得更大,但同時(shí)可能會(huì)讓一些人臉無(wú)法被檢測(cè)到。
- flags:該參數(shù)通常被省略。在使用低版本 OpenCV(OpenCV 1.X 版本)時(shí),它可能會(huì)被設(shè)置為 CV_HAAR_DO_CANNY_PRUNING,表示使用 Canny 邊緣檢測(cè)器來拒絕一些區(qū)域。
- minSize:目標(biāo)的最小尺寸,小于這個(gè)尺寸的目標(biāo)將被忽略。
- maxSize:目標(biāo)的最大尺寸,大于這個(gè)尺寸的目標(biāo)將被忽略。
- objects:返回值,目標(biāo)對(duì)象的矩形框向量組。
代碼中所涉及到的模型和視頻等資源,詳見OpenCV級(jí)聯(lián)分類器識(shí)別車輛實(shí)踐筆記中所涉及到的資源。
參考:文章來源:http://www.zghlxwxcb.cn/news/detail-735736.html
小海聊智造. opencv 進(jìn)階10-人臉識(shí)別原理說明及示例-cv2.CascadeClassifier.detectMultiScale(). CSDN博客. 2023.08
Stray_Lambs. 淺析cv2.CascadeClassifier()函數(shù). CSDN博客. 2019.09
HAMED ETEZADI ·Haar cascade classifier-Car Detection. Kaggle. 2022.04
How to Detect Cars in a Video in Python using OpenCV. Learning about Electronics文章來源地址http://www.zghlxwxcb.cn/news/detail-735736.html
到了這里,關(guān)于OpenCV級(jí)聯(lián)分類器識(shí)別車輛實(shí)踐筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!