訂閱
糾錯
加入自媒體

用 OpenCV 檢測貓臉

Python中的OpenCV貓臉檢測代碼

使用 OpenCV 的預(yù)訓(xùn)練級聯(lián)分類器可以輕松檢測照片或視頻中的貓臉。完成所有工作的代碼:

import cv2


cascade = cv2.CascadeClassifier('haarcascade_frontalcatface.xml')
 

cap = cv2.VideoCapture(0)
 

while True:

   ret, img = cap.read()

   img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

   faces = cascade.detectMultiScale(img_gray, 1.5, 5)
 

   for (x,y,w,h) in faces:

       cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,0),2)

       roi_gray = img_gray[y:y+h, x:x+w]

       roi_color = img[y:y+h, x:x+w]
       

   cv2.imshow('img',img)

   k = cv2.waitKey(30) & 0xff

   if k == 27:

       break
 

cap.release()
 

cv2.destroyAllWindows()

讓我們逐行檢查:

cv2 庫被導(dǎo)入。

如果你還沒有安裝cv2:

#install cv2

pip install opencv-python

#1

import cv2

· 加載級聯(lián)分類器 XML 文件。

#3

cascade = cv2.CascadeClassifier('haarcascade_frontalcatface.xml')

級聯(lián)分類器

級聯(lián)是一種集成學(xué)習(xí)方法,是一種使用多個分類器來提高準(zhǔn)確率的方法。第一個級聯(lián)分類器是 Viola 和 Jones (2001) 的臉部檢測器。這個分類器的要求是快速,以便在低功耗 CPU 上實現(xiàn),例如相機(jī)和電話。

級聯(lián)是一種訓(xùn)練分類器的方法(分類器是一種機(jī)器學(xué)習(xí)算法,可用于標(biāo)記事物),以便它們在鏈中協(xié)同工作。鏈中的第一個分類器訓(xùn)練在幾百張你試圖檢測的事物的“正面”圖像上,以及一堆不包含該事物的“負(fù)面”圖像上。

然后,可以將該分類器應(yīng)用于圖像的一個區(qū)域,并嘗試檢測該對象。如果它沒有找到它,它將移動到下一個區(qū)域,依此類推,直到它找到了東西或搜索了整個圖像。這個過程最常用于面部檢測和識別。

該算法通過掃描圖像并尋找與訓(xùn)練數(shù)據(jù)中的特征相匹配的 Haar 特征來工作。如果找到匹配項,則將該區(qū)域標(biāo)記為臉。如果未找到匹配項,則將該區(qū)域標(biāo)記為不是臉。

在整個圖像中進(jìn)行這種搜索是一項非常昂貴的業(yè)務(wù)。想想看,即使是 24x24 的圖像也有 160000 個特征。因此,它使用積分圖像,這是克服這一問題的有效方法。

積分圖像允許快速計算給定矩形下的像素總和,用于計算各種特征。這種方法比傳統(tǒng)方法快得多,因此非常適合用于大圖像。

位置1的值是A中像素的總和。位置2的值是A和B的總和。位置3:A+C。位置 4 A+B+C+D。D 的值為 (4+1) - (2+3)。

在我們得到這些特征(會有很多)之后,我們需要對它們進(jìn)行某種過濾,我們需要找出那些能夠告訴我們一些東西的特征。Adaboost 是一種機(jī)器學(xué)習(xí)算法,有助于從大量特征中選擇最佳特征。它通過關(guān)注與手頭任務(wù)最相關(guān)的特征來做到這一點。

我們將每個特征應(yīng)用于訓(xùn)練圖像并獲得正負(fù)示例中提供的最佳閾值。選擇在兩個方向上具有最低錯誤率的特征。Adaboost 的基礎(chǔ)分類器很弱。但是當(dāng)同時使用許多基礎(chǔ)分類器時,Adaboost 可以達(dá)到一個強(qiáng)大的水平。通過將特征從 160000 個減少到 6000 個特征,實現(xiàn)了超級增益。

通常,包含臉部的區(qū)域與整個圖像區(qū)域相比非常小。因此,到處尋找臉部仍然是低效的。相反,在你的臉更有可能出現(xiàn)在照片中間的區(qū)域。

Cascade of Classifiers 是一個引入的概念,以便更有效地將所有特征應(yīng)用于窗口。這些特征被分組到分類器的不同階段并被一一應(yīng)用。如果窗口在第一階段失敗,則不考慮剩余的特征。如果通過,則應(yīng)用第二階段的特征并繼續(xù)該過程。通過所有階段的窗口就是臉部區(qū)域。

· 為了訪問和讀取從網(wǎng)絡(luò)攝像頭接收到的數(shù)據(jù),我們創(chuàng)建了一個視頻捕獲對象并傳遞我們的設(shè)備編號。

VideoCapture 類用于捕獲視頻。你可以傳遞視頻文件的路徑。

#5

cap = cv2.VideoCapture(0)

· 啟動循環(huán)以確保視頻數(shù)據(jù)的連續(xù)流。

#7

while True:

· VideoCapture 對象(cap)讀取并解碼,返回下一幀視頻。#8

ret, img = cap.read()

#ret is True if there is a video data

#img is the image

· 我們將接收到的圖像轉(zhuǎn)換為灰度以最小化計算成本。

#9

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

· 現(xiàn)在,是時候在提供的圖像幀中檢測臉部了。我們將使用我們的級聯(lián)方法。

detectMultiScale方法檢測給定圖像中各種大小的對象。它接受灰度圖像、scaleFactor、minNeighbors、minSize、maxSize。

scaleFactor用于創(chuàng)建比例金字塔,它是一系列不同大小的圖像,用于檢測圖像中不同大小的臉部。較小的比例因子會導(dǎo)致更徹底的臉部搜索,但速度較慢,而較大的比例因子會導(dǎo)致搜索速度更快,但可能會遺漏一些臉部。

minNeighbors 參數(shù)指定每個候選矩形應(yīng)該保留多少個鄰居。該參數(shù)會影響檢測到的臉部質(zhì)量。數(shù)值越高,檢測次數(shù)越少,質(zhì)量越高。3~6是很好的參考取值。

minSize確定被檢測對象的閾值大小。對于maxSize,則相反。

#10

faces = cascade.detectMultiScale(img_gray, 1.5, 5)

· 在圖像中的面部周圍繪制矩形。

#12-13-14-15

for (x,y,w,h) in faces:

       cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,0),2)

       roi_gray = img_gray[y:y+h, x:x+w]

       roi_color = img[y:y+h, x:x+w]

收聽事件以結(jié)束程序。(在我們的例子中按下退出鍵)。

#19-20-21

k = cv2.waitKey(30) & 0xff

if k == 27:

  break

結(jié)果:

參考

image.png

       原文標(biāo)題 : 用 OpenCV 檢測貓臉

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標(biāo)題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號