最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

手把手教你完成一個Python與OpenCV人臉識別項目(對圖片、視頻、攝像頭人臉的檢測)

2023-03-30 16:29 作者:下班被游戲打-  | 我要投稿


一、讀取圖片


1.1 imshow和WaitKey方法?


?1.2 代碼實現(xiàn)


1.3 效果展示?


二、圖片灰度化


2.1 圖片灰度化作用?


2.2 所需方法


2.2.1 設置灰度方法


?2.2.2 保存圖片方法


2.3 代碼實現(xiàn)


?2.4 效果展示


2.4.1 顯示灰度圖片?


2.4.2 保存灰度圖片


三、尺寸轉(zhuǎn)換


3.1? 尺寸轉(zhuǎn)換方法


3.2 代碼展示?


3.3 效果展示


3.3.1 顯示修改后的圖片


3.3.2 保存圖片


3.3.3 輸出圖片的大小


3.4 按下英文輸入法中的m鍵后退出程序


四、繪制矩形和圓形框


?4.1 繪制矩形


4.2 繪制圓形


4.3 代碼實現(xiàn)


?4.4 效果展示


?五、人臉檢測


5.1 OpenCV自帶的分類器


5.2 detectMultiScale方法


5.3 代碼


5.4 效果展示?


六、檢測多個人臉?


?6.1 代碼實現(xiàn)


6.2 效果展示


七、對視頻的檢測


7.1 所需函數(shù)


7.1.1 創(chuàng)建讀取攝像頭/視頻對象的函數(shù)


?7.1.2 讀取視頻幀函數(shù)


7.1.3 釋放圖像


7.1.4 WaitKey方法


7.2 攝像頭捕獲識別


7.2.1 代碼實現(xiàn)?


?7.3 視頻捕獲


八、人臉信息錄入


8.1? 所需函數(shù)


8.2 0xFF的意義?


?8.3 代碼實現(xiàn)


8.4 效果展示


九、 數(shù)據(jù)訓練


9.1 項目目錄結(jié)構(gòu)


9.2 運行時出現(xiàn)的問題?


9.3 代碼


9.4 運行結(jié)果


十、人臉識別


十一、網(wǎng)絡視頻


一、讀取圖片

1.1 imshow和WaitKey方法?

waitKey()–是在一個給定的時間內(nèi)(單位ms)等待用戶按鍵觸發(fā);


waitKey() 函數(shù)的功能是不斷刷新圖像 , 頻率時間為delay , 單位為ms?


返回值為當前鍵盤按鍵值

如果用戶沒有按下鍵,則繼續(xù)等待 (循環(huán))

常見 : 設置 waitKey(0) , 則表示程序會無限制的等待用戶的按鍵事件;一般在 imgshow 的時候 , 如果設置 waitKey(0) , 代表按任意鍵繼續(xù)

? ? ? ? waitkey控制著imshow的持續(xù)時間,當imshow之后不跟waitkey時,相當于沒有給imshow提供時間展示圖像,所以只有一個空窗口一閃而過。添加了waitkey后,哪怕僅僅是CV2.waitkey(1),我們也能截取到一幀的圖像。所以CV2.imshow后邊是必須要跟CV2.waitkey的。?




?1.2 代碼實現(xiàn)

1.3 效果展示?


二、圖片灰度化

2.1 圖片灰度化作用?

?圖像處理時為什么灰度化_圖像灰度化處理的目的_whaosoft143的博客-CSDN博客?


?為什么做圖片識別要將彩色圖像灰度化呢?


圖像灰度化的目的是為了簡化矩陣,提高運算速度。


? ? ? ? 彩色圖像中的每個像素顏色由R、G、B三個分量來決定,而每個分量的取值范圍都在0-255之間,這樣對計算機來說,彩色圖像的一個像素點就會有256*256*256=16777216種顏色的變化范圍!


? ? ? ? 而灰度圖像是R、G、B分量相同的一種特殊彩色圖像,對計算機來說,一個像素點的變化范圍只有0-255這256種。


? ? ? ? 彩色圖片的信息含量過大,而進行圖片識別時,其實只需要使用灰度圖像里的信息就足夠了,所以圖像灰度化的目的就是為了提高運算速度。


? ? ? ? 當然,有時圖片進行了灰度處理后還是很大,也有可能會采用二值化圖像(即像素值只能為0或1)。


2.2 所需方法

2.2.1 設置灰度方法

cvtColor()?


?2.2.2 保存圖片方法

imwrite()


2.3 代碼實現(xiàn)

?2.4 效果展示

2.4.1 顯示灰度圖片?


2.4.2 保存灰度圖片

? ? ? ? 在關閉顯示的灰度圖片后,會將該圖片進行保存



三、尺寸轉(zhuǎn)換

3.1? 尺寸轉(zhuǎn)換方法

resize()


3.2 代碼展示?



3.3 效果展示

3.3.1 顯示修改后的圖片


3.3.2 保存圖片


3.3.3 輸出圖片的大小

3為彩色圖片的通道數(shù)。


3.4 按下英文輸入法中的m鍵后退出程序


四、繪制矩形和圓形框

?4.1 繪制矩形

?CV2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)


參數(shù)介紹:?


?python版opencv函數(shù)學習筆記-cv.rectangle()全參數(shù)理解_風一樣的夏天001的博客-CSDN博客


作用:根據(jù)給定的左上頂點和右下頂點畫矩形?


?參數(shù)說明:


img:指定一張圖片,在這張圖片的基礎上進行繪制;

pt1: 矩形的一個頂點;

pt2: 與pt1在對角線上相對的矩形的頂點;

color:指定邊框的顏色,由(B,G,R)組成,當為(255,0,0)時為綠色,可以自由設定;

thinkness:線條的粗細值,為正值時代表線條的粗細(以像素為單位),為負值時邊框?qū)嵭?

?

4.2 繪制圓形

CV2.circle(img, center, radius, color, thickness=None, lineType=None, shift=None):


作用:根據(jù)給定的圓心和半徑等畫圓


參數(shù)說明:


img:輸入的圖片data

center:圓心位置

radius:圓的半徑

color:圓的顏色

thickness:圓形輪廓的粗細(如果為正)。負厚度表示要繪制實心圓。

4.3 代碼實現(xiàn)


?4.4 效果展示


?

五、人臉檢測

5.1 OpenCV自帶的分類器

? ? ? ? ?在下圖的路徑中,我們可以看到需要xml文件,這些都是OpenCV中自帶的分類器,根據(jù)文件名我們可以看到有識別眼睛的,身體的,臉的,等等。


? ? ? ? 使用cv.CascadeClassifier(參數(shù):分類器所在路徑)方法定義一個分類器對象。

? ? ?


我的分類器所在位置:?


OpenCV分類器路徑:G:\conda\envs\testOpencv\Lib\site-packages\CV2\data

本次使用的分類器文件名:haarcascade_frontalface_alt2.xml

在代碼中輸入的完整路徑(需要把右下劃線改為左下劃線): G:/conda/envs/testOpencv/Lib/site-packages/CV2/data/haarcascade_frontalface_alt2.xml

5.2 detectMultiScale方法

opencv人臉檢測--detectMultiScale函數(shù)_walker lee的博客-CSDN博客_detectmultiscale


detectMultiScale


? ? ? ? ? ? ? ? ? ? (self,

? ? ? ? ? ? ? ? ? ? ?image: Any,

? ? ? ? ? ? ? ? ? ? ?scaleFactor: Any = None,

? ? ? ? ? ? ? ? ? ? ?minNeighbors: Any = None,

? ? ? ? ? ? ? ? ? ? ?flags: Any = None,

? ? ? ? ? ? ? ? ? ? ?minSize: Any = None,

? ? ? ? ? ? ? ? ? ? ?maxSize: Any = None)?


作用:


? ? ? ? 它可以檢測出圖片中所有的人臉,并將人臉用vector保存各個人臉的坐標、大小,用矩形Rect類表示,函數(shù)由分類器對象調(diào)用。


參數(shù)介紹:


image: 待檢測圖片,一般為灰度圖像加快檢測速度;

scaleFactor:表示在前后兩次相繼的掃描中,搜索窗口的比例系數(shù)。默認為1.1,即每次搜索窗口依次擴大10%;? ?scale_factor參數(shù)可以決定兩個不同大小的窗口掃描之間有多大的跳躍,這個參數(shù)設置的大,則意味著計算會變快,但如果窗口錯過了某個大小的人臉,則可能丟失物體

minNeighbors:默認值為3,表示每一個目標至少要被檢測到3次才算是真的目標(因為周圍的像素和不同的窗口大小都可以檢測到人臉),

flags:一般使用默認值0;

minSize和maxSize用來限制得到的目標區(qū)域的最大/最小尺寸。

5.3 代碼



5.4 效果展示?

?此時為沒有設定參數(shù),可以看到圖片識別人臉出現(xiàn)了失誤,把背景中的海浪也識別為了人臉。


在調(diào)整了參數(shù)后可以看到,人臉識別正確,識別出了一個人臉



六、檢測多個人臉?

? ? ? 此次可以識別多個人臉,與識別一個人臉的代碼基本相同,這次換了一個分類器,即OpenCV自帶的默認人臉識別分類器,調(diào)整了一下detectMultiScale的參數(shù),識別結(jié)果較為準確,但是有一個人臉未識別出來。


?6.1 代碼實現(xiàn)


6.2 效果展示


? ? ? ? ?可以看到識別的不算準確,c位的人臉沒有被識別出來,我挑了很多次參數(shù)也換了分類器還是不行,就這樣吧那~



? ? ? ? 換了一張有兩個人臉的照片,可以檢測出來。



七、對視頻的檢測

7.1 所需函數(shù)

7.1.1 創(chuàng)建讀取攝像頭/視頻對象的函數(shù)

cap = CV2.VideoCapture(filepath)


cap為讀取攝像頭或視頻的對象。?


CV2.VideoCapture可以捕獲攝像頭,用數(shù)字來控制不同的設備,例如cv.VideoCapture(0)為電腦自帶攝像頭,1為外接攝像頭。

如果是視頻文件,直接指定好路徑即可,如 cv.VideoCapture('G:/1.mp4'),即讀取在G盤中名為1的MP4視頻文件。

?7.1.2 讀取視頻幀函數(shù)

flag, frame = cap.read()


第一個參數(shù)flag為True或者False,代表有沒有讀取到圖片

第二個參數(shù)frame表示截取到一幀的圖片

?在這里我們需要使用一個循環(huán)判斷是否捕獲到圖像:


如果flag==false,說明視頻結(jié)束,退出循環(huán)

否則則繼續(xù)將視頻中捕獲到的幀圖像放入檢測函數(shù)face_detect_method中進行檢測。

while True:

? ? flag,frame = cap.read()

? ? if not flag:

? ? ? ? break

? ? face_detect_method(frame)

? ? if ord('c')==cv.waitKey(1):

? ? ? ? break

7.1.3 釋放圖像

cap.release()


? ? ? ? 使用結(jié)束后釋放攝像頭資源。


7.1.4 WaitKey方法

? ? ? ? 需要設置WaitKey方法的參數(shù)為1,如果為0的話則只能捕獲到視頻的第一幀,不能播放視頻。




7.2 攝像頭捕獲識別

7.2.1 代碼實現(xiàn)?

? ? ? ? 可以看到?


import CV2 as cv

?

# 檢測方法定義

def face_detect_method(img):

? ? grey_img = cv.cvtColor(img,cv.COLOR_BGRA2GRAY)

? ? face_detector = cv.CascadeClassifier("G:/conda/envs/testOpencv/Lib/site-packages/CV2/data/haarcascade_frontalface_default.xml")

? ? face = face_detector.detectMultiScale(grey_img,1.02,4)

? ? for x,y,w,h in face:

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

? ? cv.imshow("result",img)

?

#讀取攝像頭

cap = cv.VideoCapture(0)

#讀取視頻

#cap = cv.VideoCapture('G:/1.mp4')

?

# 循環(huán)判斷

while True:

? ? flag,frame = cap.read()

? ? if not flag:

? ? ? ? break

? ? face_detect_method(frame)

? ? if ord('c')==cv.waitKey(1):

? ? ? ? break

?

cv.destroyAllWindows()

cap.release()


? ? ? ? 可以看到打開攝像頭后成功識別到了我的臉,兩個人的也可以識別。






?7.3 視頻捕獲

使用如下語句讀取存儲的視頻:?


cap = cv.VideoCapture('G:/1.mp4')

import CV2 as cv

?

# 檢測方法定義

def face_detect_method(img):

? ? grey_img = cv.cvtColor(img,cv.COLOR_BGRA2GRAY)

? ? face_detector = cv.CascadeClassifier("G:/conda/envs/testOpencv/Lib/site-packages/CV2/data/haarcascade_frontalface_default.xml")

? ? face = face_detector.detectMultiScale(grey_img,1.02,4)

? ? for x,y,w,h in face:

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

? ? cv.imshow("result",img)

?

#讀取攝像頭

#cap = cv.VideoCapture(0)

#讀取視頻

cap = cv.VideoCapture('G:/1.mp4')

?

# 循環(huán)判斷

while True:

? ? flag,frame = cap.read()

? ? if not flag:

? ? ? ? break

? ? face_detect_method(frame)

? ? if ord('c')==cv.waitKey(1):

? ? ? ? break

?

cv.destroyAllWindows()

cap.release()


? ? ? ? ?試了一段去青島旅游的時候拍的視頻,效果還是可以的,大部分的人臉都能識別出來。




八、人臉信息錄入

8.1? 所需函數(shù)

cap.isOpened()


判斷視頻對象是否成功讀取,成功讀取視頻對象返回True。


8.2 0xFF的意義?

?CV2.waitKey(1000) & 0xFF == ord(‘q’) 是什么意思


CV2.waitKey(1000):在1000ms內(nèi)根據(jù)鍵盤輸入返回一個值

0xFF :一個十六進制數(shù)

ord('q') :返回q的ascii碼

? ? ? ? 0xFF是一個十六進制數(shù),轉(zhuǎn)換為二進制是11111111。waitKey返回值的范圍為(0-255),剛好也是8個二進制位。那么我們將 CV2.waitKey(1) & 0xFF計算一下(不知怎么計算的可以百度位與運算)發(fā)現(xiàn)結(jié)果仍然是waitKey的返回值,那為何要多次一舉呢?直接 CV2.waitKey(1) == ord('q')不就好了嗎。


? ? ? ? 實際上在linux上使用waitkey有時會出現(xiàn)waitkey返回值超過了(0-255)的范圍的現(xiàn)象。通過CV2.waitKey(1) & 0xFF運算,當waitkey返回值正常時 CV2.waitKey(1) = CV2.waitKey(1000) & 0xFF,當返回值不正常時,CV2.waitKey(1000) & 0xFF的范圍仍不超過(0-255),就避免了一些奇奇怪怪的BUG。


?8.3 代碼實現(xiàn)

?我們使用電腦自帶的攝像頭進行人臉的信息捕獲,使用num對保存圖片進行計數(shù)。

使用cap.isOpened()方法來判斷攝像頭是否開啟。

使用frame保存視頻中捕獲到的幀圖像,k獲取鍵盤按鍵,s代表保存圖像,空格代表退出程序。

當按下s鍵時,使用CV2.imwrite方法對圖片進行保存,圖片的保存路徑和命名方法按自己的習慣來;我的保存路徑是H盤的face_detect_save文件夾,命名格式為People(num).face.jpg。

?

計數(shù)器+1,表示保存圖片張數(shù)+1,繼續(xù)保存下一張。

按下空格鍵,退出循環(huán),釋放攝像頭資源和內(nèi)存空間。

import CV2 as cv

#創(chuàng)建攝像頭對象

cap = cv.VideoCapture(0)

#記錄保存圖片的數(shù)目

num = 1

?

# 當攝像頭開啟時

while(cap.isOpened()):

? ? ret,frame = cap.read()

? ? cv.imshow("show",frame)

? ? # 獲取按鍵

? ? k = cv.waitKey(1)&0xFF

? ? #按下s保存圖像

? ? if k ==ord('s'):

? ? ? ? cv.imwrite("H:/face_detect_save/"+"People"+str(num)+".face"+".jpg",frame)

? ? ? ? print("sucessfully saved"+str(num)+".jpg")

? ? ? ? print("---------------")

? ? ? ? #計數(shù)加一

? ? ? ? num+=1

? ? #按下空格退出

? ? elif k==ord(' '):

? ? ? ? break

?

cap.release()

cv.destroyAllWindows()


8.4 效果展示

? ? ? ? 程序開始運行時,攝像頭會自動打開,按下s鍵后可以保存圖片到對應的路徑中。?


? ? ? ? ?我保存了兩張圖片,可以看到對應的文件夾中已經(jīng)進行了顯示。




九、 使用數(shù)據(jù)訓練識別器

用圖片訓練一個LBPH的識別器,這里使用15張


9.1 項目目錄結(jié)構(gòu)

提前創(chuàng)建好data和trainer兩個文件夾



trainer為空文件夾

data文件夾下繼續(xù)創(chuàng)建jm文件夾,在jm其中放置訓練的圖片,圖片命名方式為:序號.姓名 ,這里我用17張王鶴棣人臉圖片進行訓練圖片。



?


9.2 主要步驟介紹

9.2.1 采集圖片文件夾中的所有文件


os.listdir可以獲取path中的所有圖像文件名,然后使用os.path.join方法把文件夾路徑和圖片名進行拼接,存儲在imagePaths列表中,此時列表中存儲的就是圖片的完整路徑,方便下一步open該圖片。


9.3 運行時出現(xiàn)的問題?

識別不到CV2模塊中的face屬性

解決方法:使用pip install命令安裝opencv-庫


對于“module ‘CV2.CV2‘ has no attribute ‘face‘與module ‘CV2‘ has no attribute ‘gapi_wip_gst_GStr 的解決方法。_羈旅少年的博客-CSDN博客


問題:File can't be opened for writing! in function 'cv::face::FaceRecognizer::write'



?解決:需要提前手動在項目目錄下創(chuàng)建好trainer文件夾




9.3 代碼

import os

import CV2 as cv

from PIL import Image

import numpy as np

?

def getImageAndLabels(path):

? ? #存儲人臉數(shù)據(jù)

? ? faceSamples = []

? ? #存儲姓名數(shù)據(jù)

? ? ids=[]

? ? #儲存圖片信息

? ? imagePaths = [os.path.join(path,f) for f in os.listdir(path)]

? ? #人臉檢測分類器

? ? face_detecter = cv.CascadeClassifier('G:/conda/envs/testOpencv/Lib/site-packages/CV2/data/haarcascade_frontalface_default.xml')

? ? #遍歷列表中的圖片

? ? for imagePath in imagePaths:

? ? ? ? #打開圖片,灰度化

? ? ? ? PIL_img = Image.open(imagePath).convert('L')

? ? ? ? #把圖像轉(zhuǎn)換為數(shù)組,

? ? ? ? img_numpy = np.array(PIL_img,'uint8')

? ? ? ? #獲取圖片人臉特征

? ? ? ? faces = face_detecter.detectMultiScale(img_numpy)

? ? ? ? #獲取每張圖片的id和姓名

? ? ? ? id = int(os.path.split(imagePath)[1].split('.')[0])

? ? ? ? #預防無面容照片

? ? ? ? for x,y,w,h in faces:

? ? ? ? ? ? ids.append(id)

? ? ? ? ? ? faceSamples.append(img_numpy[y:y+h,x:x+w])

?

? ? ? ? ? ? #打印臉部特征和id

? ? ? ? print('id:',id)

? ? ? ? print('fs:',faceSamples)

? ? ? ? return faceSamples,ids

?

if __name__ == '__main__':

? ? #圖片路徑

? ? path = './data/jm/'

? ? #獲取圖像數(shù)組和id標簽數(shù)組

? ? faces,ids = getImageAndLabels(path)

? ? #加載識別器

? ? recognizer = cv.face.LBPHFaceRecognizer_create()

? ? #訓練

? ? recognizer.train(faces,np.array(ids))

? ? #保存文件

? ? recognizer.write('trainer/trainer.yml')


9.4 運行結(jié)果

trainer文件夾中產(chǎn)生了對應的trainer.yml文件。?




十、人臉識別

十一、網(wǎng)絡視頻

需要更多的python項目? 點贊+評論學習

手把手教你完成一個Python與OpenCV人臉識別項目(對圖片、視頻、攝像頭人臉的檢測)的評論 (共 條)

分享到微博請遵守國家法律
韩城市| 吴川市| 平湖市| 寻甸| 武汉市| 邵阳市| 遂川县| 乌鲁木齐县| 浦江县| 泸溪县| 磐石市| 清涧县| 固镇县| 临朐县| 宁乡县| 礼泉县| 台东市| 鄂尔多斯市| 加查县| 祥云县| 保亭| 曲周县| 融水| 论坛| 麻阳| 嘉义县| 吉木萨尔县| 自治县| 杭锦后旗| 乌拉特后旗| 商水县| 自贡市| 石门县| 本溪| 称多县| 武隆县| 栾城县| 开阳县| 祁门县| 武邑县| 五指山市|