回答編集履歴

1

たぶんOK

2020/11/01 06:20

投稿

退会済みユーザー
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.getcwd()
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
- if image is None:# <--追加
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
- # if name == 'main' : <-- 修正
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
- # for cnt in range(1, 100):
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
- # Face_morph(img1, img2, imgMorph, tri1, tri2, tri, alpha)
572
+
564
-
565
- imgMorph = Face_morph(img1, img2, imgMorph, tri1, tri2, tri, alpha) #<--修正
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