Dieses Mal möchte ich die Form des Kopfes mit Dlib, OpenCV extrahieren oder die Ellipse als Modell anzeigen.
Umgebung ・ Python 3.7.5 ・ Opencv 4.1.2 ・ Dlib 19.18.0
Ich verweise auf die folgenden Seiten. →https://cppx.hatenablog.com/entry/2017/12/25/231121 Ich habe das trainierte Modell von der folgenden Seite heruntergeladen, um die Gesichtsorgane zu erwerben. http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
Die Programme, die bisher gemacht wurden, sind wie folgt.
head.py
import dlib
import cv2
detector = dlib.get_frontal_face_detector()#Gesichtsdetektor
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
#↑ Prädiktor(Angeben des Pfades des trainierten Modells)
def get_center(gray_img):#Finden Sie den Schwerpunkt des Bildes ↓ opencv erledigt dies für Sie
moments = cv2.moments(gray_img, False)
try:
return int(moments['m10'] / moments['m00']), int(moments['m01'] / moments['m00'])
except:
return None
#Gelegentlich tritt eine 0-Division auf, daher verarbeiten wir sie ↑
#Die damit erhaltenen Koordinaten sind die Position des Schülers ↑
def is_close(y0, y1):#Sind deine Augen geschlossen?
if abs(y0 - y1) < 10:#Die Argumente sind die y-Koordinate des oberen Augenlids und die y-Koordinate des unteren Augenlids.
return True #Unterscheiden Sie durch den Unterschied zwischen den y-Koordinaten des oberen und unteren Augenlids
return False
def head_point(img,parts):
heads = [
parts[1],part[16],
]
#Holen Sie sich Schülerkoordinaten
def eye_point(img, parts, left=True):
#Gesichtsbild und Gesichtsorgankoordinaten, linkes oder rechtes Auge(Echtes linkes Auge)
#Holen Sie sich die Koordinaten des Herzstücks ↓
if left:
eyes = [
parts[36],
min(parts[37], parts[38], key=lambda x: x.y),
max(parts[40], parts[41], key=lambda x: x.y),
parts[39],
]
#Da es sich um den 36. bis 39. handelt, extrahieren Sie diese 4 Punkte
else:
eyes = [
parts[42],
min(parts[43], parts[44], key=lambda x: x.y),
max(parts[46], parts[47], key=lambda x: x.y),
parts[45],
]
#Am Augenrand (36, 39), der über dem oberen Augenlid(37 or 38)
#Der unter dem unteren Augenlid(40 or 41)
#Erhalten Sie die Koordinaten so, dass der gesamte Augapfel eingeschlossen ist, wenn er von einem Quadrat umgeben ist
#Rechtes Auge zu den Koordinaten des linken Auges+Holen Sie sich 6 ↑
org_x = eyes[0].x
org_y = eyes[1].y
#↑ Speichern Sie die Koordinaten, um den Ursprung am Augapfel auszurichten
hrg_x = heads[0].x
if is_close(org_y, eyes[2].y):#Wenn Ihre Augen geschlossen sind, können Sie Ihre Augen nicht erkennen
return None
#Finden Sie heraus, ob Ihre Augen geschlossen sind
#↓ Schneiden Sie die Augäpfel und binärisieren Sie sie ↓
eye = img[org_y:eyes[2].y, org_x:eyes[-1].x]#Trimmen
_, eye = cv2.threshold(cv2.cvtColor(eye, cv2.COLOR_RGB2GRAY), 30, 255, cv2.THRESH_BINARY_INV)
#Binarisierung
center = get_center(eye)#Ich suche den Schwerpunkt
if center:
return center[0] + org_x, center[1] + org_y
return center
def p(img, parts, eye):#Die Argumente sind Gesichtsbild, Gesichtsorgakoordinaten und Pupillenkoordinaten.(Links rechts)
if eye[0]:#Die Pupillenkoordinaten werden als grüne Punkte und die Koordinaten der Gesichtsorgane als blaue Punkte auf dem Gesichtsbild angezeigt.
cv2.circle(img, eye[0], 3, (255, 255, 0), -1)
if eye[1]:
cv2.circle(img, eye[1], 3, (255, 255, 0), -1)
for i in parts:
cv2.circle(img, (i.x, i.y), 3, (255, 0, 0), -1)
cv2.imshow("face", img)
#Holen Sie sich Video von der Kamera
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
#Fügen Sie hier die Verarbeitung hinzu---
#Zum Beispiel, wenn Sie die oberen Koordinaten der Nase erhalten möchten
#parts[33].x
#parts[33].y
#↓ Holen Sie sich die Koordinaten der Gesichtsorgane
dets = detector(frame[:, :, ::-1])
if len(dets) > 0:
parts = predictor(frame, dets[0]).parts()
left_eye = eye_point(frame, parts)#Neben den Gesichtsorganen der Augen werden auch die Augen angezeigt
right_eye = eye_point(frame, parts, False)
p(frame, parts, (left_eye,right_eye))#frame*Bei 0*Wenn Sie nicht 0
#Auf dem ursprünglichen Gesichtsbild werden Punkte überlagert angezeigt
#
if cv2.waitKey(1) == 27:
break
#Geben Sie die Aufnahme frei und schließen Sie alle Fenster
#Bisher----
cap.release()
cv2.destroyAllWindows()
#Wenn Sie keine Kamera haben
#frame = cv2.imread("Bildpfad")
#cv2.imshow("me", frame) #Zur Bestätigung
#Fügen Sie hier die Verarbeitung hinzu---
#Bisher----
#cv2.waitKey(0)
#cv2.destroyAllWindows()
Ich möchte diesem Programm mehr hinzufügen, um ein Modell des Kopfes zu erstellen. Ich wünschte, ich könnte es extrahieren, aber ich möchte ein elliptisches Modell (Kopfmodell) erstellen, das mit den 68 Orientierungspunkten 1 und 17 im Bild unten verbunden ist.
Ich habe viel recherchiert, aber es hat nicht funktioniert. Wenn jemand es verstehen kann, lassen Sie es mich bitte wissen. Ich freue mich darauf, mit Dir zu arbeiten.
Recommended Posts