回答編集履歴
1
たぶんOK
test
CHANGED
@@ -1,11 +1,27 @@
|
|
1
|
+
![GMH](e04a040db1d617c2711f7c4da8dff350.jpeg)
|
2
|
+
|
3
|
+
![35%](f23542e186925f3dbaa7c75788fc4f0e.jpeg)
|
4
|
+
|
5
|
+
![65%](bb334e606d44a7744dae99050fe05df4.jpeg)
|
6
|
+
|
7
|
+
![FEA](eb93786cade8449fe8db63e7c9b88607.jpeg)
|
8
|
+
|
1
|
-
|
9
|
+
※画像はwikiより。共にプログラマー界のスーパーおかあちゃんです。
|
10
|
+
|
11
|
+
|
12
|
+
|
2
|
-
|
13
|
+
コメントにも書きましたが、細かいエラーがたくさんありましたので個別には書きません。コメントと行間を察する温かい気持ちでコードを読んでください。
|
14
|
+
|
3
|
-
|
15
|
+
---
|
16
|
+
|
17
|
+
なお、fourteenlengthは「技量を証明したくて、むしゃくしゃしてやった、後悔はしていない」などと意味不明なことを供述しており…
|
4
18
|
|
5
19
|
```Python3
|
6
20
|
|
7
21
|
import argparse
|
8
22
|
|
23
|
+
|
24
|
+
|
9
25
|
import cv2
|
10
26
|
|
11
27
|
import numpy as np
|
@@ -24,8 +40,6 @@
|
|
24
40
|
|
25
41
|
from imutils import face_utils# <--追加
|
26
42
|
|
27
|
-
|
28
|
-
|
29
43
|
def Face_landmarks(image_path):
|
30
44
|
|
31
45
|
print("[INFO] loading facial landmark predictor...")
|
@@ -34,21 +48,21 @@
|
|
34
48
|
|
35
49
|
|
36
50
|
|
37
|
-
path = os.
|
51
|
+
path = os.path.split(__file__)[0]+"\" # <--デバグ用に修正
|
38
52
|
|
39
53
|
print(path)
|
40
54
|
|
41
55
|
|
42
56
|
|
43
|
-
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
|
57
|
+
predictor = dlib.shape_predictor(path + "shape_predictor_68_face_landmarks.dat") # <--デバグ用に修正
|
44
|
-
|
45
|
-
|
46
|
-
|
58
|
+
|
59
|
+
|
60
|
+
|
47
|
-
image = cv2.imread(image_path)
|
61
|
+
image = cv2.imread(path + image_path)# <--デバグ用に修正
|
48
|
-
|
49
|
-
|
50
|
-
|
62
|
+
|
63
|
+
|
64
|
+
|
51
|
-
|
65
|
+
--追加
|
52
66
|
|
53
67
|
# 画像が読めないとNoneになるため
|
54
68
|
|
@@ -142,15 +156,29 @@
|
|
142
156
|
|
143
157
|
if __name__ == '__main__':
|
144
158
|
|
145
|
-
# filename = 'image/MarilynMonroe.jpg'
|
146
|
-
|
147
159
|
filename = 'image/Grace_Murray_Hopper.jpg'
|
148
160
|
|
149
161
|
|
150
162
|
|
151
163
|
name,ext = os.path.splitext(filename)
|
152
164
|
|
165
|
+
|
166
|
+
|
167
|
+
path = os.path.split(__file__)[0]+"\" # <--デバグ用に
|
168
|
+
|
153
|
-
img = cv2.imread(filename)
|
169
|
+
img = cv2.imread(path + filename)# <--デバグ用に修正
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
if img is None:# <--追加
|
174
|
+
|
175
|
+
# 画像が読めないとNoneになるため
|
176
|
+
|
177
|
+
print("File loading error @ __name__ == '__main__'")
|
178
|
+
|
179
|
+
sys.exit()
|
180
|
+
|
181
|
+
|
154
182
|
|
155
183
|
points = Face_landmarks(filename) # failname --> filename
|
156
184
|
|
@@ -170,6 +198,8 @@
|
|
170
198
|
|
171
199
|
cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1)
|
172
200
|
|
201
|
+
|
202
|
+
|
173
203
|
cv2.imwrite('%s-points.jpg' %name,img)
|
174
204
|
|
175
205
|
|
@@ -256,8 +286,6 @@
|
|
256
286
|
|
257
287
|
ind = []
|
258
288
|
|
259
|
-
|
260
|
-
|
261
289
|
for j in range(0, 3):
|
262
290
|
|
263
291
|
for k in range(0, len(points)):
|
@@ -270,9 +298,9 @@
|
|
270
298
|
|
271
299
|
delaunayTri.append((ind[0], ind[1], ind[2]))
|
272
300
|
|
273
|
-
|
301
|
+
# print(delaunayTri)
|
274
|
-
|
302
|
+
|
275
|
-
pt = []
|
303
|
+
pt = []
|
276
304
|
|
277
305
|
|
278
306
|
|
@@ -324,7 +352,7 @@
|
|
324
352
|
|
325
353
|
"""
|
326
354
|
|
327
|
-
|
355
|
+
|
328
356
|
|
329
357
|
# 各三角形の座標を含む最小の矩形領域 (バウンディングボックス)を取得
|
330
358
|
|
@@ -356,21 +384,21 @@
|
|
356
384
|
|
357
385
|
|
358
386
|
|
359
|
-
# 三角形のマスクを生成
|
387
|
+
# 三角形のマスクを生成
|
360
|
-
|
388
|
+
|
361
|
-
# 三角形の領域のピクセル値は1で、残りの領域のピクセル値は0になる
|
389
|
+
# 三角形の領域のピクセル値は1で、残りの領域のピクセル値は0になる
|
362
|
-
|
390
|
+
|
363
|
-
mask = np.zeros((r[3], r[2], 3), dtype = np.float32)
|
391
|
+
mask = np.zeros((r[3], r[2], 3), dtype = np.float32)
|
364
|
-
|
392
|
+
|
365
|
-
cv2.fillConvexPoly(mask, np.int32(tRect), (1.0, 1.0, 1.0), 16, 0)
|
393
|
+
cv2.fillConvexPoly(mask, np.int32(tRect), (1.0, 1.0, 1.0), 16, 0)
|
366
|
-
|
367
|
-
|
368
|
-
|
394
|
+
|
395
|
+
|
396
|
+
|
369
|
-
# アフィン変換の入力画像を用意
|
397
|
+
# アフィン変換の入力画像を用意
|
370
|
-
|
398
|
+
|
371
|
-
img1Rect = img1[r1[1]:r1[1] + r1[3], r1[0]:r1[0] + r1[2]]
|
399
|
+
img1Rect = img1[r1[1]:r1[1] + r1[3], r1[0]:r1[0] + r1[2]]
|
372
|
-
|
400
|
+
|
373
|
-
img2Rect = img2[r2[1]:r2[1] + r2[3], r2[0]:r2[0] + r2[2]]
|
401
|
+
img2Rect = img2[r2[1]:r2[1] + r2[3], r2[0]:r2[0] + r2[2]]
|
374
402
|
|
375
403
|
|
376
404
|
|
@@ -400,18 +428,14 @@
|
|
400
428
|
|
401
429
|
|
402
430
|
|
431
|
+
|
432
|
+
|
403
433
|
# マスクと投影結果を使用して論理AND演算を実行し、
|
404
434
|
|
405
435
|
# 三角形領域の投影されたピクセル値を取得しOutput用画像にコピー
|
406
436
|
|
407
437
|
img[r[1]:r[1]+r[3], r[0]:r[0]+r[2]] = img[r[1]:r[1]+r[3], r[0]:r[0]+r[2]] * ( 1 - mask ) + imgRect * mask
|
408
438
|
|
409
|
-
|
410
|
-
|
411
|
-
# cv2.imshow("img",img)# <-- 追加
|
412
|
-
|
413
|
-
# cv2.waitKey(10) # <-- 追加
|
414
|
-
|
415
439
|
return img# <-- 追加
|
416
440
|
|
417
441
|
|
@@ -432,33 +456,27 @@
|
|
432
456
|
|
433
457
|
|
434
458
|
|
435
|
-
|
459
|
+
if __name__ == '__main__': # <-- 修正
|
436
|
-
|
437
|
-
if __name__ == '__main__':
|
438
|
-
|
439
|
-
|
440
460
|
|
441
461
|
os.makedirs("./output",exist_ok=True) # <-- 追加
|
442
462
|
|
443
463
|
|
444
464
|
|
465
|
+
path = os.path.split(__file__)[0]+"\" # <--デバグ用に追加
|
466
|
+
|
467
|
+
|
468
|
+
|
445
469
|
# モーフィングする画像取得
|
446
470
|
|
447
|
-
# filename1 = 'image/AudreyHepburn.jpg'
|
448
|
-
|
449
|
-
# filename2 = 'image/MarilynMonroe.jpg'
|
450
|
-
|
451
471
|
filename1 = 'image/Grace_Murray_Hopper.jpg'
|
452
472
|
|
453
473
|
filename2 = 'image/Frances_Elizabeth_Allen.jpg'
|
454
474
|
|
455
475
|
|
456
476
|
|
457
|
-
|
458
|
-
|
459
|
-
img1 = cv2.imread(filename1)
|
477
|
+
img1 = cv2.imread(path + filename1)
|
460
|
-
|
478
|
+
|
461
|
-
img2 = cv2.imread(filename2)
|
479
|
+
img2 = cv2.imread(path + filename2)
|
462
480
|
|
463
481
|
|
464
482
|
|
@@ -504,10 +522,6 @@
|
|
504
522
|
|
505
523
|
# 顔の特徴点を取得
|
506
524
|
|
507
|
-
# points1 = face_landmarks.Face_landmarks(filename1)
|
508
|
-
|
509
|
-
# points2 = face_landmarks.Face_landmarks(filename2)
|
510
|
-
|
511
525
|
points1 = Face_landmarks(filename1) # <--修正
|
512
526
|
|
513
527
|
points2 = Face_landmarks(filename2) # <--修正
|
@@ -516,9 +530,7 @@
|
|
516
530
|
|
517
531
|
# 1~99%割合を変えてモーフィング
|
518
532
|
|
519
|
-
|
533
|
+
for cnt in range(1, 100):
|
520
|
-
|
521
|
-
for cnt in range(1, 100,10): # <--デバグ用に修正
|
522
534
|
|
523
535
|
alpha = cnt * 0.01
|
524
536
|
|
@@ -532,8 +544,6 @@
|
|
532
544
|
|
533
545
|
# ドロネーの三角形(座標配列とpoints要素番号)を取得
|
534
546
|
|
535
|
-
# triangles, delaunay = face_delaunay.Face_delaunay(rect,points)
|
536
|
-
|
537
547
|
triangles, delaunay = Face_delaunay(rect,points1,points2,alpha)# <--修正
|
538
548
|
|
539
549
|
|
@@ -542,7 +552,7 @@
|
|
542
552
|
|
543
553
|
imgMorph = np.zeros(img1.shape, dtype = img1.dtype)
|
544
554
|
|
545
|
-
|
555
|
+
|
546
556
|
|
547
557
|
# ドロネー三角形の配列要素番号を読込
|
548
558
|
|
@@ -558,19 +568,17 @@
|
|
558
568
|
|
559
569
|
|
560
570
|
|
561
|
-
# モーフィング画像を作成
|
571
|
+
# モーフィング画像を作成
|
562
|
-
|
563
|
-
|
572
|
+
|
564
|
-
|
565
|
-
imgMorph
|
573
|
+
imgMorph= Face_morph(img1, img2, imgMorph, tri1, tri2, tri, alpha) #<--修正
|
566
|
-
|
567
|
-
|
574
|
+
|
575
|
+
|
568
576
|
|
569
577
|
# モーフィング画像をint型に変換し出力
|
570
578
|
|
571
579
|
imgMorph = np.uint8(imgMorph)
|
572
580
|
|
573
|
-
cv2.imwrite('output/picture-%s.jpg' % str(cnt).zfill(3),imgMorph)
|
581
|
+
cv2.imwrite(path +'output/alpha_[%s]_picture-%s.jpg' % (str(cnt).zfill(2),str(cnt).zfill(3)),imgMorph) #<--修正
|
574
582
|
|
575
583
|
cv2.imshow("imgMorph",imgMorph) # <-- 追加
|
576
584
|
|