Python顔認識 (GUIインターフェース) - pyopencvをベースとする
今日の一言 <スパン 静かに輝き、そしてみんなを驚かせる!!!!
序文
このプロジェクトは、学校の開始といくつかの他の問題のために、夏の終わりの前に著者が書いたプロジェクトであり、著者は、Javaを移行する必要があると、側にプロジェクトをされている後にパイソンを書くためのプロジェクトの多くはないかもしれませんが、今日の週末を利用して、私は側面を改善するために、リポジトリからプロジェクトをドラッグし、非常にフル機能ではないかもしれませんが、私はそれが皆に助けをもたらすことができると思います!.
目次
プロジェクト概要
まずは結果から。
最初に操作できるGUIインターフェイスを書きました。
ボタンのうち2つは、対応する機能に対応しています。
顔をキャプチャします。
認識機能。
色を50/50/50に犠牲にしています。(パソコンの画素はあまり良くないので、我慢してくださいへっへっへ)
プロジェクトのアイデア
このプロジェクトは、pythonのcv2画像認識ライブラリを使って、コンピュータのカメラを取得して顔を認識し顔画像を保存し、保存した顔画像をcv2のこの二つの学習ツール(これらは既に書かれている顔認識アルゴリズム)で直接呼び出せるようにするものである。
プロジェクトモジュール
このプロジェクトは、大きく分けて4つのモジュールに分けられます。
1. 顔の取得
で
cv2.CascadeClassifier('haarcascade_frontalface_default.xml')カメラ画像と顔情報を比較し、顔の核となる部分を見つけ矩形で囲み、指示を待ち、次のステップで顔画像を保存します。
これらは私が保存したものです(私の色を犠牲にしてウハウハ)これらはデータ学習に使用します。
2. データトレーニング
ディレクトリ内の画像を配列に変換し、各画像の顔部分のデータを取得してあらかじめ作成したリストに保存、各画像のIDを取得して同じくあらかじめ作成したリストに保存し、最後に学習済みデータを保存します。
3. 顔認識
cv2が学習したデータをファイルに入れてくれるので、このデータを直接呼び出して、認識時にカメラの上にある顔と比較するのです。
上の画像は、学習させたファイルの1つです。
認識効果はご覧の通り、上記の通りです!!!!
4. GUIインターフェース
pyqtを使った簡単なGUIを設計し、以前のブログで説明したようにpyqtの環境を設定しました -。 pyqtの紹介
2つのシンプルなボタンを使ってビジュアライズしています。
プロジェクトコード
フェイスキャプチャ
import numpy as np import cv2 def b(): print('Camera is being called!') faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') cap = cv2.VideoCapture(0) cap.set(3,640) # set Width cap.set(4,480) # set Height while True: ret, img = cap.read() # convert color map to grayscale gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale( gray, scaleFactor=1.2, minNeighbors=5 , minSize=(20, 20) ) for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] cv2.imshow('video',img) k = cv2.waitKey(30) & 0xff if k == ord('s'): n = input('Please enter the number:') cv2.imwrite('. /data/jm/'+n+'.jpg',roi_gray) if k == 27: # press 'ESC' to quit break cap.release() cv2.destroyAllWindows() b()
データトレーニング
import os import cv2 import sys from PIL import Image import numpy as np def getImageAndLabels(path): facesSamples=[] ids=[] imagePaths=[os.path.join(path,f) for f in os.listdir(path)] # Detect faces face_detector = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml') # Print the array imagePaths print('Data alignment:',imagePaths) # Iterate over the images in the list for imagePath in imagePaths: #open the image, black and white PIL_img=Image.open(imagePath).convert('L') # Convert the image to an array, in black and white shades # PIL_img = cv2.resize(PIL_img, dsize=(400, 400)) img_numpy=np.array(PIL_img,'uint8') # Get image face features faces = face_detector.detectMultiScale(img_numpy) #Get the id and name of each image id = int(os.path.split(imagePath)[1].split('.') [0]) # Prevent faceless photos for x,y,w,h in faces: ids.append(id) facesSamples.append(img_numpy[y:y+h,x:x+w]) #print the face features and ids #print('fs:', facesSamples) print('id:', id) #print('fs:', facesSamples[id]) print('fs:', facesSamples) #print('face examples:', facesSamples[0]) #print('identity information:',ids[0]) return facesSamples,ids if __name__ == '__main__': #image path path='. /data/jm/' #Get image array and id tag array and names faces,ids=getImageAndLabels(path) #Get the training object recognizer=cv2.face.LBPHFaceRecognizer_create() #recognizer.train(faces,names)#np.array(ids) recognizer.train(faces,np.array(ids)) #Save the file recognizer.write('trainer/trainer3.yml')
顔認識
import cv2 import os def a(): # load recognizer recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.read('trainer/trainer3.yml') # load classifier cascade_path = "haarcascade_frontalface_alt2.xml" face_cascade = cv2.CascadeClassifier(cascade_path) cam = cv2.VideoCapture(0) minW = 0.1*cam.get(3) minH = 0.1*cam.get(4) font = cv2.FONT_HERSHEY_SIMPLEX names = [] agelist=[21,21,21,21,21,21,21,22] path='. /data/jm/' imagePaths=[os.path.join(path,f) for f in os.listdir(path)] for imagePath in imagePaths: id = int(os.path.split(imagePath)[1].split('.') [0]) names.append(id) while True: ret, img = cam.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale( gray, scaleFactor=1.3, minNeighbors=5, minSize=(int(minW), int(minH)) ) for (x, y, w, h) in faces: cv2.rectangle(img, (x , y ), (x + w , y + h ), (225, 0, 0), 2) img_id, confidence = recognizer.predict(gray[y:y + h, x:x + w]) print(img_id,confidence) if confidence < 50: confidence = "{0}%".format(round(100 - confidence)) else: img_id = "Unknown" confidence = "{0}%".format(round(100 - confidence)) if img_id ! = "Unknown": print('Recognition successful!!!') else: print('Recognition failed!!!') cv2.putText(img, str(img_id), (x, y + h), font, 0.55, (0, 255, 0), 1) cv2.putText(img, "18", (x , y + 500), font, 1, (0, 255, 0), 1) cv2.putText(img, "18", (x , y +h + 150), font, 1, (0, 255, 0), 1) cv2.putText(img, str(confidence), (x + 5, y - 5), font, 1, (0, 255, 0), 1) cv2.imshow('face', img) if cv2.waitKey(5) & 0xFF == 27: break cam.release() cv2.destroyAllWindows()
GUIをマージする
from PyQt5 import QtCore, QtGui, QtWidgets import cv2 class Ui_MainWindow(QtWidgets.QMainWindow): def __init__(self): super(Ui_MainWindow,self). __init__() def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(565, 331) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(70, 190, 111, 61)) self.pushButton.setObjectName("pushButton") self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(310, 190, 121, 61)) self.pushButton_2.setObjectName("pushButton_2") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(180, 60, 161, 81)) self.label.setObjectName("label") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 565, 26)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.pushButton.setText(_translate("MainWindow", "Capturing face information")) self.pushButton_2.setText(_translate("MainWindow", "Start recognition")) # self.label.setText(_translate("MainWindow", "Result: ")) self.pushButton.clicked.connect(self.b) self.pushButton_2.clicked.connect(self.final) def b(self): print('Camera is being called!') print("typing 'esc' for exit!!! ") faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') cap = cv2.VideoCapture(0) cap.set(3, 640) # set Width cap.set(4, 480) # set Height print("Please enter the letter 's' to save the message! ") while True: ret, img = cap.read() # Convert the color map to grayscale gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale( gray, scaleFactor=1.2, minNeighbors=5 , minSize=(20, 20) ) for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) roi_gray = gray[y:y + h, x:x + w] roi_color = img[y:y + h, x:x + w] cv2.imshow('video', img) k = cv2.waitKey(30) & 0xff if k == ord('s'): n = input('Please enter the number:') cv2.imwrite('. /data/jm/' + n + '.jpg', roi_gray) if k == 27: break cap.release() cv2.destroyAllWindows() print("Training!!! ") self.train() def final(self): import face_zhineng.final_face face_zhineng.final_face.a() def train(self): import cv2 import numpy as np import face_zhineng.training # image path path = '. /data/jm/' faces, ids = face_zhineng.training.getImageAndLabels(path) # Get the training object recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.train(faces, np.array(ids)) # Save the file recognizer.write('trainer/trainer3.yml') print("Training complete!!! ") if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())
プロジェクト概要
このプロジェクトはついに完成しました、長いため息ですハハハハハハハハハハハハハハハハハハハハハハハハハハハハハハハハハハハハハ。
プロジェクトは、実際にいくつかの顔を開くソフトウェアに拡張することができ、もともとこれを書くことを意図して、しかし、時間とエネルギーのために非常に豊富ではありません、私は単に少しを得る、あなたがパートナーに興味がある場合は、それを自分で試して行くことができます![OK]をクリックします。
次は最終審査なので、皆さんも良い成績を残してくださいね。
<スパン ゴーゴーゴーゴー!!(笑
関連
-
[解決済み】「RuntimeWarning: divide by zero encountered in double_scalars」を修正する方法
-
[解決済み】RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility.
-
[解決済み】Python:ソースコードの文字列にヌルバイトを含めることはできない
-
[解決済み】Anaconda Runtime Error: Pythonはフレームワークとしてインストールされていない?
-
[解決済み】再帰:反復中にPythonのset changed setを回避する方法 RuntimeError
-
[解決済み] syntaxError: 'continue' がループ内で適切に使用されていない。
-
[解決済み] matlab の "bwconncomp" と "label matrix" に相当する python の関数はありますか?
-
[解決済み] モジュール 'pandas' には 'rolling_mean' という属性がありません。
-
[解決済み] Cythonコンパイルエラー:動的モジュールにモジュールエクスポート関数が定義されていない
-
データフレームの基本
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み】ValueError: NA / NaN値を含むベクトルでインデックスを作成できない
-
[解決済み】pythonでimmutable辞書を作成する方法は?
-
[解決済み】Pythonの__rlshift__、__ror__について
-
[解決済み] Python リストの ndim 配列への再形成
-
[解決済み] pyファイルのコンパイル時にutilsという名前のモジュールがないエラーが発生する
-
[解決済み] os.sepとos.path.sepのどちらを使えばいいのでしょうか?
-
[解決済み] インテル® MKL FATAL ERROR。libmkl_avx2.so または libmkl_def.so をロードできません。
-
'dict' オブジェクトに 'has_key' 属性がない ソリューション
-
IndexError: Index 0 is out of bounds for axis 0 with size 0