#前提・実現したいこと
取得した顔ランドマークの座標(両目、鼻、口の両端)とベクトルをテキストファイルなりなんなりで出力したい
#発生している問題・エラーメッセージ
f = write () だったり、f =open () など試してみたがどうもうまく行かなかった
一度に5つも同時に書き込むことはできない?
#該当のソースコード
html
1 2 3import dlib #no module 4import cv2 #no module 5import numpy #as np 6 7detector = dlib.get_frontal_face_detector() 8predictor = dlib.shape_predictor('dlib-master/dlib-master/python_examples/shape_predictor_68_face_landmarks.dat/shape_predictor_68_face_landmarks.dat') 9 10 11#ここに処理を追加 12def get_center(gray_img): 13 moments = cv2.moments(gray_img, False) 14 try: 15 return int(moments['m10'] / moments['m00']), int(moments['m01'] / moments['m00']) 16 except: 17 return None 18 19 20def is_close(y0, y1): 21 if abs(y0 - y1) < 1: 22 return True 23 return False 24 25 26def eye_point(img, parts, left=True): 27 if left: 28 eyes = [ 29 parts[36], 30 min(parts[37], parts[38], key=lambda x: x.y), 31 max(parts[40], parts[41], key=lambda x: x.y), 32 parts[39], 33 ] 34 else: 35 eyes = [ 36 parts[42], 37 min(parts[43], parts[44], key=lambda x: x.y), 38 max(parts[46], parts[47], key=lambda x: x.y), 39 parts[45], 40 ] 41 org_x = eyes[0].x#座標の保存 42 org_y = eyes[1].y 43 if is_close(org_y, eyes[2].y): 44 return None 45 46 eye = img[org_y:eyes[2].y, org_x:eyes[-1].x] 47 _, eye = cv2.threshold(cv2.cvtColor(eye, cv2.COLOR_RGB2GRAY), 30, 255, cv2.THRESH_BINARY_INV) 48 49 center = get_center(eye) 50 if center: 51 return center[0] + org_x, center[1] + org_y 52 return center 53 54 55def p(img, parts, eye): 56 if eye[0]: 57 cv2.circle(img, eye[0], 3, (255, 255, 0), -1) 58 if eye[1]: 59 cv2.circle(img, eye[1], 3, (255, 255, 0), -1) 60 61 for i in parts: 62 cv2.circle(img, (i.x, i.y), 3, (255, 0, 0), -1) 63 64 cv2.imshow("me1", img) 65# cv2.imshow("me2", frame) 66 67#画像ファイルに保存 68 cv2.imwrite("image/test003.png", img); 69 70 71frame = cv2.imread('image/face002.jpg')#画像の読み込み 72#frame = cv2.resize(frame1,(,))#画像の大きさを変更する 73 74 75dets = detector(frame[:, :, ::-1]) 76if len(dets) > 0: 77 parts = predictor(frame, dets[0]).parts() 78 79 left_eye = eye_point(frame, parts) 80 right_eye = eye_point(frame, parts, False) 81 82 p(frame * 1, parts, (left_eye, right_eye)) 83 84 85cv2.waitKey(0) 86cv2.destroyAllWindows() 87 88print('left_eye(x,y) = ', left_eye) 89# 90print('right_eye(x,y) = ', right_eye) 91 92val1 = numpy.array([left_eye]) 93val2 = numpy.array([right_eye]) 94val3 = numpy.array([parts[33].x,parts[33].y]) 95val4 = numpy.array([parts[48].x,parts[48].y]) 96val5 = numpy.array([parts[54].x,parts[54].y]) 97 98print('left_eye , right_eye , nose , lmouth , rmouth \n' , val1 ,val2 , val3 ,val4 ,val5) 99
#自分で調べたことや試したこと
出力結果
left_eye(x,y) = (76, 154)
right_eye(x,y) = (182, 152)
left_eye , right_eye , nose , lmouth , rmouth
[[ 76 154]] [[182 152]] [127 218] [ 92 263] [168 260]
最初は上の出力結果をコピペしながらエクセルに入力していたのですが時間と労力がかかりすぎて
自動化させたいと思った
可能なら複数の画像に対して同時に行い
画像ごとの結果をエクセルの縦列ごとに並べて行く予定
(テキストファイル→エクセルで可能なので、最低限テキストファイルに書き込むまではやる)
参考元:https://cppx.hatenablog.com/entry/2017/12/25/231121
#使っているツールのバージョンなど補足
opencv 4.1.2
python 3.7.4
numpy ver1.16.5
回答3件
あなたの回答
tips
プレビュー