🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1336閲覧

取得した顔器官の座標とベクトルを、テキストファイルに出力したい

takahiro_tt

総合スコア9

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/16 15:50

#前提・実現したいこと

取得した顔ランドマークの座標(両目、鼻、口の両端)とベクトルをテキストファイルなりなんなりで出力したい

#発生している問題・エラーメッセージ
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2019/10/17 01:35

「f = write () だったり、f =open () など試してみたがどうもうまく行かなかった」ときのコードを質問に追記いただくと、何故上手くいかないのか分かるかもしれません。
takahiro_tt

2019/10/17 02:41

返信ありがとうございます https://note.nkmk.me/python-file-io-open-with/ 上記サイトを参考にwrite()文を追加で書いてみたのですが [ TypeError: str() takes at most 3 arguments (6 given) ] のエラーが出てきました str型だと3つまでしか無理そうです --- xx = 'test.txt,w' s = str(' , , , , ' ,val1,val2,val3,val4,val5) with open(xx, mode='w') as f: f.write(s) with open(xx) as f: print(f.read()) ---
takahiro_tt

2019/10/17 02:48

追伸:xx = 'test.txt,w' が .txtではなく(,txt)になっていたので.txtに修正してもう一度試してみましたが同じエラーを出されました
takahiro_tt

2019/10/17 07:39

何度ももうしわけありません 上のプログラムで言う「val1~val5」の値を変数か引数を書きこもうとして 色々調べてみたのですが、どこにも書いていないまたは自分が基礎を応用できず、できませんでした なにか参考となるような記述があるならば教えていただくと幸いです よろしくおねがいします
guest

回答3

0

ベストアンサー

新規テキストファイルへの書き込みは下記で出来ます。

Python

1with open('a.txt','w') as f: 2 f.write('b')

write()の引数は文字列にします。
下記はval1とval2をカンマで区切って出力する例です。

Python

1f.write(','.join([str(val1),str(val2)]))

投稿2019/10/17 11:44

meg_

総合スコア10739

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takahiro_tt

2019/10/17 14:27

ありがとうございます 無事テキストファイルに出力することができました
guest

0

ありがとうございます
調べてみたら結構便利そうでした

複数枚同時はまだ少し考えないといけなそうです

投稿2019/10/17 06:17

takahiro_tt

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

(テキストファイル→エクセルで可能なので、最低限テキストファイルに書き込むまではやる)

Excelで書き込みだけなら、xlwtで行えますよ。

可能なら複数の画像に対して同時に行い

画像ごとの結果をエクセルの縦列ごとに並べて行く予定

シート変えた方が早くないですかね...

投稿2019/10/17 05:25

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問