Heim > Artikel > Backend-Entwicklung > Schenken Sie mit Python eine Weihnachtsmütze
Weihnachten steht vor der Tür, aber ich glaube, es sind schon viele Weihnachtsmützen im Umlauf. Heute werden wir eine Weihnachtsmütze hinzufügen unser Avatar.
In Computern werden Bilder in Form einer Matrix gespeichert, Zeilen zuerst und Spalten dann. Daher wird ein Bild mit der Breite × Höhe × Farbkanal = 480 × 256 × 3 in einem dreidimensionalen Tensor von 256 × 480 × 3 gespeichert. Auch die Bildverarbeitung wird nach dieser Idee berechnet (einschließlich der Bildverarbeitung unter OpenCV), also Höhe × Breite × Farbkanal.
Bei einem digitalen Bild sehen wir ein echtes Bild, das mit bloßem Auge sichtbar ist, aber für einen Computer ist dieses Bild nur eine Ansammlung von Punkten mit unterschiedlichen Helligkeiten. Ein Bild der Größe M × N kann durch eine M × N-Matrix dargestellt werden. Der Wert des Matrixelements stellt die Helligkeit des Pixels an dieser Position dar. Im Allgemeinen gilt: Je größer der Pixelwert, desto heller der Punkt.
Im Allgemeinen werden Graustufenbilder durch zweidimensionale Matrizen dargestellt, und Farbbilder (Mehrkanalbilder) werden durch dreidimensionale Matrizen (M× N × 3) dargestellt.
beschreibt ein Pixel, wenn es sich um Graustufen handelt, ist nur ein Wert zur Beschreibung erforderlich, nämlich ein einzelner Kanal. Wenn ein Pixel drei Farben hat, RGB, um es zu beschreiben, hat es drei Kanäle. Ein Vierkanalbild besteht aus R, G, B plus einem A-Kanal, was Transparenz anzeigt. Im Allgemeinen Alphakanal genannt, was auf Transparenz hinweist.
Einstellen der Region of Interest (ROI), im Volksmund übersetzt als Festlegen der Region of Interest. Mask ist ein Bildmaskierungsprozess, der dem Abdecken der Teile entspricht, die uns nicht interessieren, und dem Verlassen des ROI-Teils. Das oben erwähnte Alpha kann als Maske verwendet werden.
Matrix-Indizierung, Slicing usw. Ich beherrsche es hier nicht gut, daher werde ich nicht auf Details eingehen. Freunde können es selbst lernen.
Da wir nun über die Grundkenntnisse verfügen, werfen wir einen kurzen Blick auf den Code.
Installieren Sie zunächst die OpenCV- und dlib-Bibliotheken, die Sie verwenden müssen, und installieren Sie sie jeweils mit pip .net/files/ , laden Sie es herunter und legen Sie es im Projektverzeichnis ab.
Interessierte Schüler können mit shape_predictor_68_face_landmarks.dat spielen, das bis zu 68 Schlüsselpunkte auf Gesichtern erkennt.
CodeverarbeitungHutverarbeitung
pip install python-opencv pip install dlib
Der Effekt, den wir erhalten, ist wie folgt:
RGB-Bild
Alpha-Bild Der gedruckte a-Wert ist wie folgt:# 帽子Schenken Sie mit Python eine Weihnachtsmütze hat_img3 = cv2.imread("hat.png", -1) r, g, b, a = cv2.split(hat_img3) rgb_hat = cv2.merge((r, g, b)) cv2.imwrite("rgb_hat.jpg", rgb_hat) cv2.imwrite("alpha.jpg", a) print(a) print(hat_img3.shape) print(rgb_hat.shape)
Gesichtserkennung
Gesichtserkennung wird unten mithilfe der dlib-Verarbeitung durchgeführt.
[[0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] ... [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0]]
Der nächste Schritt besteht darin, das Bild des Hutes zu verkleinern.
# 人脸检测 dets = self.detector(img, 1) x, y, w, h = dets[0].left(), dets[0].top(), dets[0].right() - dets[0].left(), dets[0].bottom() - dets[0].top() # 关键点检测 shape = self.predictor(img, dets[0]) point1 = shape.parts()[0] point2 = shape.parts(2) # 求两点中心 eyes_center = ((point1.x + point2.x) // 2, (point1.y + point2.y) // 2)
ROI-Extraktion.
Die Variable mask_inv wird verwendet, um den Bereich zu extrahieren, in dem der Hut im Gesichtsbild installiert ist.Als nächstes nehmen Sie den hutförmigen Bereich (ROI) im Gesichtsbild heraus.
# 帽子和人脸转换比例 hat_w = int(round(dets[0].right()/1.5)) hat_h = int(round(dets[0].bottom() / 2)) if hat_h > y: hat_h = y - 1 hat_newsize = cv2.resize(rgb_hat, (hat_w, hat_h)) mask = cv2.resize(a, (hat_w, hat_h)) mask_inv = cv2.bitwise_not(mask) dh = 0 dw = 0 bg_roi = img[y+dh-hat_h:y+dh,(eyes_center[0]-hat_w//3):(eyes_center[0]+hat_w//3*2)]Dann entfernen Sie den hutförmigen Bereich im Gesichtsbild Bild Der Typ wird für den Betrieb in einen Float-Typ konvertiert und schließlich wieder zurückkonvertiert. Das zusammengesetzte Bild Im dunklen Teil wollen wir den Hut platzieren. Entpacken Sie den Hutteil aus dem Hutbild.
# 用alpha通道作为mask mask = cv2.resize(a, (resized_hat_w, resized_hat_h)) mask_inv = cv2.bitwise_not(mask)Verwenden Sie zum Extrahieren das Hutbild, dessen Größe Sie gerade geändert haben.
可以看到,除了帽子部分,其他区域已经掩模处理了。
以上就是提取ROI的过程,比较难懂,需要好好琢磨,尤其是矩阵的切片、mask处理部分。
最后一步就是把人脸Schenken Sie mit Python eine Weihnachtsmütze与帽子合成到一起了,也就是把人脸空余帽子部分的Schenken Sie mit Python eine Weihnachtsmütze区域和帽子只展示帽子区域的Schenken Sie mit Python eine Weihnachtsmütze区域(有点拗口)合并在一起。
# 相加之前保证两者大小一致(可能会由于四舍五入原因不一致) hat = cv2.resize(hat, (bg_roi.shape[1], bg_roi.shape[0])) # 两个ROI区域相加 add_hat = cv2.add(bg, hat)
效果如下:
刚刚好,完美叠加Schenken Sie mit Python eine Weihnachtsmütze。
最后把这个片段放回人脸原图中,展示Schenken Sie mit Python eine Weihnachtsmütze
img[y+dh-hat_h:y+dh, (eyes_center[0]-hat_w//3):(eyes_center[0]+hat_w//3*2)] = add_hat
美美的Schenken Sie mit Python eine Weihnachtsmütze就出来啦!
我们再尝试几张不同的Schenken Sie mit Python eine Weihnachtsmütze。
整体效果还不错哦,需要注意的是,在测试的时候,我们尽量选择人脸占比比较大的Schenken Sie mit Python eine Weihnachtsmütze来合成,效果要好很多哦~
Das obige ist der detaillierte Inhalt vonSchenken Sie mit Python eine Weihnachtsmütze. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!