最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于opencv和pillow實(shí)現(xiàn)人臉識(shí)別系統(tǒng)(附demo)

 更新時(shí)間:2021年11月23日 15:56:33   作者:愛(ài)編程的小段  
人臉識(shí)別就是一個(gè)程序能識(shí)別給定圖像或視頻中的人臉,本文主要介紹了opencv和pillow實(shí)現(xiàn)人臉識(shí)別系統(tǒng),本文不涉及分類(lèi)器、訓(xùn)練識(shí)別器等算法原理,感興趣的可以了解一下

本文不涉及分類(lèi)器、訓(xùn)練識(shí)別器等算法原理,僅包含對(duì)其應(yīng)用(未來(lái)我也會(huì)寫(xiě)自己對(duì)機(jī)器學(xué)習(xí)算法原理的一些觀點(diǎn)和了解)
首先我們需要知道的是利用現(xiàn)有框架做一個(gè)人臉識(shí)別系統(tǒng)并不難,然后就開(kāi)始我們的系統(tǒng)開(kāi)發(fā)吧。
我們的系統(tǒng)主要分為三個(gè)部分,然后我還會(huì)提出對(duì)補(bǔ)獲圖片不能添加中文的解決方案。我們需要完成的任務(wù):1.人臉檢測(cè)和數(shù)據(jù)收集2.訓(xùn)練識(shí)別器3.人臉識(shí)別和顯示

在讀此篇文章之前我相信你已經(jīng)做了python環(huán)境部署和opencv模塊的下載安裝工作,現(xiàn)在我們還需要的模塊是pillow(樹(shù)莓派默認(rèn)帶有此模塊,但如果你用的是win系統(tǒng)可能還需要另外安裝,在終端輸入pip install pillow即可),和opencv-contrib模塊,cv2的face模塊包含在內(nèi)(當(dāng)然我的Linux系統(tǒng)的樹(shù)莓派貌似仍然默認(rèn)包含了此模塊,所以如果你是用的pc可能需要另外下載),以及最基本的numpy模塊。

在開(kāi)始寫(xiě)代碼之前我們首先需要在當(dāng)前運(yùn)行目錄中添加兩個(gè)文件夾,dataset用于存放捕獲到的人臉圖像,方便后面訓(xùn)練識(shí)別器,trainer文件夾則存放了訓(xùn)練結(jié)果

一。人臉檢測(cè)和數(shù)據(jù)收集

#數(shù)據(jù)采集
cam = cv2.VideoCapture(0)#補(bǔ)獲圖片
cam.set(3, 640) # set video width
cam.set(4, 480) # set video height
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#導(dǎo)入分類(lèi)器
# For each person, enter one numeric face id
face_id = input('\n 輸入用戶(hù)id')
print("\n 數(shù)據(jù)采集中,請(qǐng)正視攝像頭輕微扭轉(zhuǎn)")
# Initialize individual sampling face count
count = 0
while(True):
 ret, img = cam.read()#ret為是否成功讀取,是一個(gè)布爾值
 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#轉(zhuǎn)化為灰度圖
 faces = face_detector.detectMultiScale(gray, 1.3, 5,minSize=(100,100))
 for (x,y,w,h) in faces:#此處faces是一個(gè)array數(shù)組或空的元組,原因我后面會(huì)分析
  cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)
  count += 1
 # Save the captured image into the datasets folder
  cv2.imwrite("dataset/User." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w])
 cv2.imshow('image', img)
 k = cv2.waitKey(100) & 0xff # Press 'ESC' for exiting video
 if k == 27:
  break
 elif count >= 10: # Take 10 face sample and stop video
  break
# Do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

在這一部分中我們完成了人臉的補(bǔ)獲,并將其保存在了我們建立的dataset文件夾,并將每一個(gè)人的數(shù)據(jù)用特定的id表述,這樣我們就能訓(xùn)練能識(shí)別不同人臉的識(shí)別器。cam.set這一步中第二個(gè)參數(shù)是圖像的分辨率,640×480是opencv的默認(rèn)分辨率,但其仍支持800×600且最大支持1280乘1024像素,即使你的攝像頭最大允許分辨率遠(yuǎn)大于這個(gè)值,opencv貌似仍不會(huì)允許你使用。之后就是haar級(jí)聯(lián)分類(lèi)器的導(dǎo)入,在配置過(guò)程中,我們已經(jīng)下載了opencv自帶的分類(lèi)器,你只需要在文件管理器中查找haarcascade_frontalface_default.xml這個(gè)文件即可,在這個(gè)文件所在的文件夾中有許多分類(lèi)器,當(dāng)然如果你要識(shí)別例如蘋(píng)果香蕉等物體你可能需要訓(xùn)練新的分類(lèi)器(這也很容易做到),本文討論的是人臉識(shí)別,因此這里不再贅述,你可以選擇用其絕對(duì)路徑導(dǎo)入,當(dāng)然你也可以像我一樣將其復(fù)制到你當(dāng)前目錄中。然后進(jìn)入循環(huán),圖片的讀取->轉(zhuǎn)灰度圖,然后是使用你已經(jīng)導(dǎo)入的分類(lèi)器識(shí)別人臉并將其用方框標(biāo)出,然后將方框內(nèi)的圖片儲(chǔ)存入dataset文件夾中。值得一提的是,因?yàn)榉诸?lèi)器的算法是很慢的,所以分類(lèi)器本身就有減幀處理(即使這樣我的樹(shù)莓派帶人臉識(shí)別系統(tǒng)仍然很吃力),所以faces應(yīng)該是大部分時(shí)間都是空的元組,小部分時(shí)間是讀取到的array數(shù)組,因此你需要特別注意縮進(jìn)問(wèn)題,不要讓分類(lèi)器本身的減幀影響你視頻讀取并顯示的幀數(shù)。

二.訓(xùn)練識(shí)別器

import cv2
#訓(xùn)練器
import numpy as np
from PIL import Image
import os
# Path for face image database
path = 'dataset'
recognizer = cv2.face.LBPHFaceRecognizer_create()#識(shí)別器的導(dǎo)入
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
# function to get the images and label data
def getImagesAndLabels(path):
 imagePaths = [os.path.join(path,f) for f in os.listdir(path)]#在這里os模塊可以幫助我們很好的建立路徑,建議可以先查看一下相關(guān)函數(shù)的使用方法。
 faceSamples=[]
 ids = []
 for imagePath in imagePaths:
  PIL_img = Image.open(imagePath).convert('L') #轉(zhuǎn)化為灰度圖
  img_numpy = np.array(PIL_img,'uint8')#轉(zhuǎn)化為數(shù)組
  id = int(os.path.split(imagePath)[-1].split(".")[1])
  faces = detector.detectMultiScale(img_numpy)
  for (x,y,w,h) in faces:
   faceSamples.append(img_numpy[y:y+h,x:x+w])
   ids.append(id)
 return faceSamples,ids
print ("\n 訓(xùn)練數(shù)據(jù)中,請(qǐng)稍后")
faces,ids = getImagesAndLabels(path)
recognizer.train(faces, np.array(ids))
# Save the model into trainer/trainer.yml
recognizer.write('trainer/trainer.yml') # recognizer.save() worked on Mac, but not on Pi
# Print the numer of faces trained and end program
print("\n {0} 張臉訓(xùn)練完畢. 程序關(guān)閉".format(len(np.unique(ids))))

在這一步我們需要對(duì)識(shí)別器按照不同id分別訓(xùn)練并保存結(jié)果,并將結(jié)果匯總寫(xiě)入trainer文件夾中命名為trainer.yml。這個(gè)文件里就是訓(xùn)練好的識(shí)別器。

三.人臉識(shí)別和顯示

# -*- coding: UTF-8 -*-
#識(shí)別器
import cv2
import numpy as np
import os
from PIL import Image, ImageFont, ImageDraw
path_to_ttf = 'C:\Windows\Fonts\Microsoft YaHei UI\msyh.ttc'#ttc文件是支持漢語(yǔ)的字體,稍后我會(huì)說(shuō)明。
font1= ImageFont.truetype(path_to_ttf, size=20)
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')#讀取識(shí)別器
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);
font = cv2.FONT_HERSHEY_SIMPLEX
#iniciate id counter
id = 0
# names related to ids: example ==> Marcelo: id=1, etc
names = ['None', '段林晨', 'Paula', 'Ilza', 'Z', 'W']#因?yàn)槲覀儾粫?huì)在人臉識(shí)別時(shí)只顯示你的代號(hào)而是要顯示你的具體信息。
cam = cv2.VideoCapture(0)
cam.set(3, 640) # set video widht
cam.set(4, 480) # set video height
#最小識(shí)別的臉的大小,在識(shí)別過(guò)程中,我們不會(huì)捕獲到距離你很遠(yuǎn)的街上路人的信息,這會(huì)導(dǎo)致很多問(wèn)題,因此我們只需要識(shí)別想?yún)⑴c識(shí)別的人,而設(shè)置最小人臉識(shí)別大小可以規(guī)避這一點(diǎn)
minW = 0.1*cam.get(3)
minH = 0.1*cam.get(4)
while True:
 ret, img =cam.read()
 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
 faces = faceCascade.detectMultiScale(
 gray,
 scaleFactor = 1.2,
 minNeighbors = 5,
 minSize = (int(minW), int(minH)),
 )#相關(guān)參數(shù)設(shè)置可以自行搜索
 for(x,y,w,h) in faces:
  cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
  id, confidence = recognizer.predict(gray[y:y+h,x:x+w])
 # Check if confidence is less them 100 ==> "0" is perfect match
  if (confidence < 100):
   id = names[id]
   confidence = " {0}%".format(round(100 - confidence))#confidence是置信度指數(shù),等于100-概率,相信大家的概率統(tǒng)計(jì)一定比我優(yōu)秀
  else:
   id = "未識(shí)別"
   confidence = " {0}%".format(round(100 - confidence))
  img=Image.fromarray(img)
  draw = ImageDraw.Draw(img)
  draw.text(xy=(x+5,y-5), text=str(id), font=font1,fill=(255,255,255))
  img=np.array(img)
  cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1)
 cv2.imshow('camera',img)
 k = cv2.waitKey(10) & 0xff # Press 'ESC' for exiting video
 if k == 27:
  break
# Do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

在這一步中,很遺憾的是cv2.putText函數(shù)并不支持漢語(yǔ)的應(yīng)用,即你不能通過(guò)這個(gè)函數(shù)將漢語(yǔ)姓名顯示在視頻中,雖然你可能會(huì)有英文名或干脆用漢語(yǔ)拼音,但這個(gè)問(wèn)題我們必須要解決。因此我們?cè)谶@里引入了pillow模塊,我們只需要使用img.draw功能在圖片上先打出你的姓名,再進(jìn)行cv2.putText函數(shù)就能很好的解決這個(gè)問(wèn)題,但是比較麻煩的是這兩個(gè)函數(shù)涉及到的圖片類(lèi)型是不一樣的,因此我在代碼中對(duì)img和array圖像進(jìn)行了轉(zhuǎn)換,最終完成了人臉識(shí)別系統(tǒng)。

到此這篇關(guān)于基于opencv和pillow實(shí)現(xiàn)人臉識(shí)別系統(tǒng)(附demo)的文章就介紹到這了,更多相關(guān)opencv pillow實(shí)現(xiàn)人臉識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中Flask-RESTful編寫(xiě)API接口(小白入門(mén))

    Python中Flask-RESTful編寫(xiě)API接口(小白入門(mén))

    這篇文章主要介紹了Python中Flask-RESTful編寫(xiě)API接口(小白入門(mén)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • python使用pymongo操作mongo的完整步驟

    python使用pymongo操作mongo的完整步驟

    這篇文章主要給大家介紹了關(guān)于python使用pymongo操作mongo的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Tensorflow訓(xùn)練MNIST手寫(xiě)數(shù)字識(shí)別模型

    Tensorflow訓(xùn)練MNIST手寫(xiě)數(shù)字識(shí)別模型

    這篇文章主要為大家詳細(xì)介紹了Tensorflow訓(xùn)練MNIST手寫(xiě)數(shù)字識(shí)別模型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Python學(xué)習(xí)之字符串函數(shù)使用詳解

    Python學(xué)習(xí)之字符串函數(shù)使用詳解

    Python的友好在于提供了非常好強(qiáng)大的功能函數(shù)模塊,對(duì)于字符串的使用,同樣提供許多簡(jiǎn)單便捷的字符串函數(shù)。Python 字符串自帶了很多有用的函數(shù),快來(lái)跟隨小編學(xué)習(xí)一下這些函數(shù)的應(yīng)用詳解吧
    2021-12-12
  • python中的deque基本用法詳解

    python中的deque基本用法詳解

    Python?中的?deque是一個(gè)低級(jí)別的、高度優(yōu)化的雙端隊(duì)列,對(duì)于實(shí)現(xiàn)優(yōu)雅、高效的Pythonic隊(duì)列和堆棧很有用,這篇文章主要介紹了python中的deque基本用法的相關(guān)資料,需要的朋友可以參考下
    2017-11-11
  • Python實(shí)現(xiàn)提取Excel嵌入圖片并重命名

    Python實(shí)現(xiàn)提取Excel嵌入圖片并重命名

    我們?cè)谌粘^k公的時(shí)候經(jīng)常需要將Excel中嵌入單元的圖片進(jìn)行提取,并在提取的時(shí)候?qū)⑵渲械哪骋涣凶鳛樘崛〕鰣D片的命名,本文將使用Python實(shí)現(xiàn)這一功能,需要的可以了解下
    2025-04-04
  • Python深度學(xué)習(xí)pytorch神經(jīng)網(wǎng)絡(luò)Dropout應(yīng)用詳解解

    Python深度學(xué)習(xí)pytorch神經(jīng)網(wǎng)絡(luò)Dropout應(yīng)用詳解解

    這篇文章主要為大家介紹了Python深度學(xué)習(xí)中關(guān)于pytorch神經(jīng)網(wǎng)絡(luò)Dropout的應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • Pytest運(yùn)行方式及參數(shù)使用示例詳解

    Pytest運(yùn)行方式及參數(shù)使用示例詳解

    這篇文章主要介紹了Pytest運(yùn)行方式及參數(shù)使用詳細(xì)教程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Python操作列表之List.insert()方法的使用

    Python操作列表之List.insert()方法的使用

    這篇文章主要介紹了Python操作列表之List.insert()方法的使用,是Python入門(mén)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • Python OpenCV基于霍夫圈變換算法檢測(cè)圖像中的圓形

    Python OpenCV基于霍夫圈變換算法檢測(cè)圖像中的圓形

    這篇文章主要介紹了通過(guò)霍夫圈變換算法檢測(cè)圖像中的圓形,文中用到的函數(shù)為cv2.HoughCircles(),該函數(shù)可以很好地檢測(cè)圓心。感興趣的小伙伴可以了解一下
    2021-12-12

最新評(píng)論

廊坊市| 甘谷县| 镇雄县| 健康| 富裕县| 宁乡县| 镇远县| 武宁县| 磴口县| 绥宁县| 杨浦区| 罗城| 新源县| 揭东县| 梓潼县| 黄石市| 和林格尔县| 中牟县| 嘉荫县| 贵定县| 疏附县| 浮梁县| 武鸣县| 平凉市| 新丰县| 眉山市| 兰西县| 鸡东县| 梅河口市| 安龙县| 五峰| 唐山市| 苗栗县| 沙湾县| 自治县| 额敏县| 泸水县| 怀集县| 荥阳市| 武汉市| 建平县|