Heim  >  Artikel  >  Backend-Entwicklung  >  Schenken Sie mit Python eine Weihnachtsmütze

Schenken Sie mit Python eine Weihnachtsmütze

WBOY
WBOYnach vorne
2023-04-12 17:22:101719Durchsuche

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.

Grundlegende Wissensvorbereitung

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.

Digitales Bild

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.

Bildkanal

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.

ROI und Maske

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 (Numpy)-Wissen

Matrix-Indizierung, Slicing usw. Ich beherrsche es hier nicht gut, daher werde ich nicht auf Details eingehen. Freunde können es selbst lernen.

Umgebungsvorbereitung

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.

Codeverarbeitung

Schenken Sie mit Python eine WeihnachtsmützeHutverarbeitung

Das erste, was wir tun müssen, ist, das von uns verwendete Bild wie folgt zu verarbeiten:

Extrahieren Sie zunächst die RGB- und Alphawerte von Das Hutbild

Schenken Sie mit Python eine Weihnachtsmütze

pip install python-opencv

pip install dlib

Der Effekt, den wir erhalten, ist wie folgt:

RGB-Bild

Alpha-Bild

Schenken Sie mit Python eine Weihnachtsmütze

Der gedruckte a-Wert ist wie folgt:

Schenken Sie mit Python eine Weihnachtsmütze

# 帽子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)]
Schenken Sie mit Python eine Weihnachtsmütze

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

Schenken Sie mit Python eine Weihnachtsmütze

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.

Schenken Sie mit Python eine Weihnachtsmütze

可以看到,除了帽子部分,其他区域已经掩模处理了。

以上就是提取ROI的过程,比较难懂,需要好好琢磨,尤其是矩阵的切片、mask处理部分。

合成Schenken Sie mit Python eine Weihnachtsmütze

最后一步就是把人脸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。

最后把这个片段放回人脸原图中,展示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。

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen