Raspberry3使用WebCam+OpenCV進行人臉辨識 - Google Sites
文章推薦指數: 80 %
Raspberry3使用WebCam+OpenCV進行人臉辨識 ... Step3)使用指令「mkdir images」新增資料夾images。
假設以下程式為1.py,使用「python3 1.py」 ...
高中資訊科技概論教師黃建庭的教學網站搜尋這個協作平台
黃建庭的教學網站新版黃建庭教學網站高三資訊課程108資訊科技基礎C++與PythonPython程式設計Python與資料分析C++演算法解題(1)C++演算法解題(2)機器學習教學平台ZSOJ資訊能力競賽考古題資訊能力檢定APCSRaspberry樹莓派ArduinoArduino與Scratch2FreeBSD/Linux筆記網管筆記AppInventor2Scratch2PHP程式設計JavaScript程式設計107資訊科技概論程式設計--使用機器人micro:bitAmeba3D列印JetBotDjangoLXR軟體使用心得相簿學生榮譽榜學經歷與著作與我聯絡連結高中生程式解題系統(zerojudge)UvaOnlineJudge資訊之芽(fb)Bebras系統管理新聞協作平台地圖最新協作平台活動
FreeHitCounter
版權宣告學校上課使用,可不標記作者
黃建庭的教學網站>Raspberry樹莓派>
Raspberry3使用WebCam+OpenCV進行人臉辨識
Raspberry3+Python3+opencv-contrib-python3.4.3.18Step1)安裝Python3+OpenCV,請參考Raspberry3安裝Python3+OpenCV
Step2)接上WebCam後,如果正常連線,會出現/dev/video0裝置,攝影機對應在/dev/video0
Step3)使用指令「mkdirimages」新增資料夾images。
假設以下程式為1.py,使用「python3 1.py」就會開啟攝影機進行拍照,一次抓取30張,輸入id號碼,從數字1開始,一個數字表示一個人,請用攝影機近距離拍攝同一個人臉的各個角度,會自動計算30張,儲存到資料夾images。
使用「python3 1.py」再次執行程式,下一個人使用數字2。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
importcv2
importos
camema=cv2.VideoCapture(0)#對應/dev/video0的攝影機
camema.set(3,640)#設定影片寬度
camema.set(4,480)#設定影片高度
detector=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
id=input('\n請輸入id?')
print("\n初始化錄影機,請等待")
count=0
while(True):
ret,img=camema.read()
img=cv2.flip(img,1)#設定影像左右互換
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#轉換成灰階
faces=detector.detectMultiScale(gray,scaleFactor=1.3,minNeighbors=5)#辨識影像
for(x,y,w,h)infaces:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)#加上綠框
count+=1
cv2.imwrite("images/User."+str(id)+'.'+str(count)+".jpg",gray[y:y+h,x:x+w])#儲存影像到dataset資料夾
cv2.imshow('image',img)
k=cv2.waitKey(100)&0xff#等待0.1秒,偵測鍵盤按鍵是否按下
ifk==27:#按下ESC按鍵,中斷while迴圈
break
elifcount>=30:#偵測30張臉後,中斷while迴圈
break
print("\n偵測完成")
camema.release()
cv2.destroyAllWindows()在images資料夾下,程式會自動擷取每人30張照片如下。
Step4)訓練照片,假設以下程式為2.py,使用「python3 2.py」就會讀取images資料夾下所有圖片,進行分析,訓練資料儲存到train資料夾下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
importcv2
importnumpyasnp
fromPILimportImage
importos
path='images'
recognizer=cv2.face.LBPHFaceRecognizer_create()
detector=cv2.CascadeClassifier("haarcascade_frontalface_default.xml");
defgetFaceAndID(path):
images=[os.path.join(path,f)forfinos.listdir(path)]
FaceList=[]
IDList=[]
forimageinimages:
img=Image.open(image).convert('L')#轉換成灰階
img_np=np.array(img,'uint8')
id=int(os.path.split(image)[-1].split(".")[1])
faces=detector.detectMultiScale(img_np)
for(x,y,w,h)infaces:
FaceList.append(img_np[y:y+h,x:x+w])
IDList.append(id)
returnFaceList,IDList
print("\n影像辨識中")
face,id=getFaceAndID(path)
recognizer.train(face,np.array(id))
recognizer.write('train/train.yml')#儲存訓練結果
print("\n訓練出{0}張臉".format(len(np.unique(id))))
在train資料夾下,多出檔案train.yml,為訓練的結果。
Step5)辨識影片,假設以下程式為3.py,請修改第12行names的名字,第一個人的名字取代「建庭」,第二個人的名字取代「大明」,使用「python3 3.py」就會開啟攝影機,讀取train資料夾的訓練結果進行影像辨識,cv2無法顯示中文,所以將圖片轉換成PIL,加上中文字後,再轉換成cv2顯示出來。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47importcv2
importnumpyasnp
importos
fromPILimportImage,ImageDraw,ImageFont
recognizer=cv2.face.LBPHFaceRecognizer_create()#使用舊版opencv-contrib-python,例如:版本3.4.3.18
recognizer.read('train/train.yml')
cascadePath="haarcascade_frontalface_default.xml"
faceCascade=cv2.CascadeClassifier(cascadePath);
font=ImageFont.truetype('NotoSerifCJK-Regular.ttc',40)#sudoapt-getinstallfonts-noto-cjk
id=0
names=['None','建庭','大明','小明','真真','阿丁']#id為1,對應名字為建庭
camema=cv2.VideoCapture(0)
camema.set(3,640)#設定影片寬度
camema.set(4,480)#設定影片高度
minW=0.1*camema.get(3)
minH=0.1*camema.get(4)
blue=(255,0,0)
green=(0,255,0)
red=(0,0,255)
whileTrue:
ret,img=camema.read()
img=cv2.flip(img,1)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces=faceCascade.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=5,minSize=(int(minW),int(minH)))
for(x,y,w,h)infaces:
cv2.rectangle(img,(x,y),(x+w,y+h),green,2)
id,confidence=recognizer.predict(gray[y:y+h,x:x+w])
if(confidence<100):
name=names[id]
confidence=str(100-round(confidence))+"%"
else:
name="未知"
confidence=str(100-round(confidence))+"%"
imgPIL=Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))#cv2轉換成PIL
draw=ImageDraw.Draw(imgPIL)
draw.text((x+5,y-5),str(name),font=font,fill=blue)#使用PIL顯示中文
draw.text((x+5,y+h-5),str(confidence),font=font,fill=red)
img=cv2.cvtColor(np.asarray(imgPIL),cv2.COLOR_RGB2BGR)#PIL轉換成cv2
cv2.imshow('image',img)
k=cv2.waitKey(10)&0xff#等待0.01秒
ifk==27:
break
print("\n程式結束")
camema.release()
cv2.destroyAllWindows()
以下為實際辨識的樹梅派桌面截圖。
參考資料
https://kknews.cc/code/rplm8en.html
https://github.com/Mjrovai/OpenCV-Face-Recognition/tree/master/FacialRecognition
Comments
Signin|RecentSiteActivity|ReportAbuse|PrintPage|PoweredByGoogleSites
延伸文章資訊
- 1利用python、tensorflow、opencv實現人臉識別(包會)!
opencv -- 3.3.1. keras -- 3.0.X. sklearn -- 0.19.0. 三、正式開始. 1,識別人臉.
- 2使用Python的OpenCV進行圖片人臉辨識
使用Python的OpenCV進行圖片人臉辨識. GitHub Gist: instantly share code, notes, and snippets.
- 3OPENCV in Python 電腦視覺與人臉辨識入門教學
在windows下安裝opencv. ○檢查是否安裝. ○程式一:讀檔秀檔. ○程式二:啟動鏡頭. ○程式三:按按鍵擷取圖檔. ○程式四:靜態人臉辨識.
- 4Python影像辨識筆記(一):使用Open CV辨識圖片及影片中的人臉
pip install opencv-python. 偵測人臉. import cv2# 載入分類器 face_cascade = cv2.CascadeClassifier('haarcasc...
- 5Raspberry3使用WebCam+OpenCV進行人臉辨識 - Google Sites
Raspberry3使用WebCam+OpenCV進行人臉辨識 ... Step3)使用指令「mkdir images」新增資料夾images。假設以下程式為1.py,使用「python3 1....