Wenn Sie ein Programm ausführen, das Ihre Eingaben ausgibt, z. B. ein Spiel "Ich wünschte ich könnte das Gesicht erkennen und es bedienen?" Ich habe darüber nach gedacht. Also habe ich ein Programm erstellt, das OpenCV verwendet, um auf die Position des Gesichts zu reagieren und von dort aus den Mittelpunkt des Gesichts zu finden. Selbst wenn ich das denke, ist es bedeutungslos, wenn ich es mit einem Standbild vor dem Programm, das das Video verarbeitet, nicht richtig erkennen kann. Deshalb habe ich ein Programm erstellt, das das Foto verarbeiten kann, und es dann ermöglicht, es mit dem Video zu verarbeiten.
Geben Sie die Position des Gesichts mit OpenCV an
MacBookPro 2019 2,4 GHz Core i5-Speicher 16 GB OS:macOS Mojave10.14.6 Python(anaconda)
Es erfasst ein Gesicht mithilfe der OpenCV-Bibliothek und gibt die Koordinatenpunkte des Fotos aus.
Vorerst habe ich mit einer bereits vorhandenen Bibliothek etwas erstellt, das ein Gesicht spezifiziert, ohne darüber nachzudenken.
Face_photo.ipynb
import cv2
import matplotlib.pyplot as plt
image_name = input("File Name?")
src=cv2.imread(image_name)
image_gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #Graustufen
color=(0,0,255) #Kakomu Typ(rot)
color_c=(255,0,0) #Derjenige, der trifft(Punkt,Blau)
cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml") #Import von Trainingsdaten
#Finde ein Gesicht
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(50,50))
if len(facerect) > 0:
for rect in facerect:
cv2.rectangle(src,tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]),color,thickness = 2) #Linie um das Gesicht
cv2.circle(src,tuple(rect[0:2]+rect[2:4]//2),5,color_c,thickness=-10) #Punkt in der Mitte
print(rect[0:2]+rect[2:4]//2)#Den Mittelpunkt ausgeben
cv2.imwrite(image_name+"_result.jpg ",src)#Derjenige, der gerettet werden soll
Auf diese Weise können Sie Punkte auf Ihrem Gesicht zeichnen. Infolgedessen sieht es so aus. (Originalfoto) (Ausgabeergebnis)
Ich glaube, ich konnte es auf gute Weise festhalten.
Bei dieser Methode gab es jedoch die folgenden Probleme. Wenn Sie das Loch in der Nase und den Nasenboden als Nase betrachten, ist es ein Gesicht (Kippari)
Ich kann nichts sagen, also muss ich das auch beheben.
Lassen Sie uns diesmal mit dem Körper darüber nachdenken, dass wir eine Person erkennen sollten. Der Grund dafür ist, dass das ultimative Ziel darin besteht, mit dem Gesicht zu operieren, sodass nicht viele Menschen angenommen werden müssen. Lassen Sie uns also nur das große Gesicht erkennen.
Face_Photo.ipynb
import cv2
import matplotlib.pyplot as plt
image_name = input("File Name?")
# image_name = "27708.jpg " #Fotos aufnehmen
src=cv2.imread(image_name)
image_gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #Graustufen
color=(0,0,255) #Kakomu Typ(rot)
color_c=(255,0,0) #Derjenige, der trifft(Punkt,Blau)
big_face=(0,0,0,0)
cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml") #Import von Trainingsdaten
#Ein Zauber zum Verwalten
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(50,50))
if len(facerect) > 0:
for rect in facerect:
print(rect)
if(big_face[2]<rect[2]):
big_face= rect
cv2.rectangle(src,tuple(big_face[0:2]),tuple(big_face[0:2]+big_face[2:4]),color,thickness = 2) #Linie um das Gesicht
cv2.circle(src,tuple(big_face[0:2]+big_face[2:4]//2),5,color_c,thickness=-10) #Punkt in der Mitte
print("Ergebnis:%d" + (big_face[0:2]+big_face[2:4]//2))#Den Mittelpunkt ausgeben
cv2.imwrite(image_name+"_result.jpg ",src)#Derjenige, der gerettet werden soll
Ich beschloss, das größte Gesicht in etwas namens big_face zu speichern. Es klingt wie ein schlechtes Wort, ist es aber nicht. Natürlich ist dies jetzt ein guter Weg, um Ihr größtes Gesicht zu retten.
Zu diesem Zeitpunkt ist es die Endphase. Ich habe es mit Video zum Laufen gebracht.
Face_Video.ipynb
import cv2
import matplotlib.pyplot as plt
# image_name = input("File Name?")
# image_name = "27708.jpg " #Fotos aufnehmen
cap=cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH,640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,480)
while True:
ret,src=cap.read()
if not ret:
print("Couldn't detect camera.")
break
key=cv2.waitKey(1)&0xff
if key==ord("q"):
print("Given a exit command.")
break
image_gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #Graustufen
color=(0,0,255) #Kakomu Typ(rot)
color_c=(255,0,0) #Derjenige, der trifft(Punkt,Blau)
big_face=(0,0,0,0)
cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml") #Import von Trainingsdaten
#Ein Zauber zum Verwalten
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(50,50))
if len(facerect) > 0:
for rect in facerect:
if(big_face[2]<rect[2]):
big_face= rect
cv2.rectangle(src,tuple(big_face[0:2]),tuple(big_face[0:2]+big_face[2:4]),color,thickness = 2) #Linie um das Gesicht
cv2.circle(src,tuple(big_face[0:2]+big_face[2:4]//2),5,color_c,thickness=-10) #Punkt in der Mitte
print(big_face[0:2]+big_face[2:4]//2)#Den Mittelpunkt ausgeben
cv2.imshow("result",src)
cv2.waitKey(1)
cv2.destroyAllWindows()
cap.release()
Wenn Sie es bisher schaffen, sieht es wie folgt aus. Jetzt funktioniert es richtig. Darüber hinaus kann die Position der Nase selbst hier auch als numerischer Wert ausgegeben werden. Wenn Sie diesen verwenden, können Sie an der Position des Gesichts arbeiten. Übrigens habe ich eingefügt, dass es endet, wenn ich q drücke, aber es hat nicht mit jupyter geantwortet. Trauer.
Es gibt jedoch ein Problem mit dieser Methode, und sie reagiert nicht, wenn es sich um ein Profil handelt. Dies bedeutet nicht, dass das Profil Shinkansen ist, aber es gibt ein Problem, dass es nicht reagiert, da es sich um die Daten handelt, die in erster Linie über die Vorderseite gelernt wurden. Wenn Sie also eine Kamera und einen Bildschirm vollständig vor sich haben und diese in einem Spiel verwenden, können Sie sie meiner Meinung nach voll ausnutzen.
Das war's für die Gesichtserfassung mit OpenCV.
Für alle Bilder, die dieses Mal verwendet wurden, habe ich die Bilder von Pakutaso verwendet.
Recommended Posts