Raspberry3使用WebCam+OpenCV進行人臉辨識 - Google Sites

文章推薦指數: 80 %
投票人數:10人

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



請為這篇文章評分?