質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

87.48%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,643

score 9

前提・実現したいこと

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

発生している問題・エラーメッセージ

f = write () だったり、f =open () など試してみたがどうもうまく行かなかった
一度に5つも同時に書き込むことはできない?

該当のソースコード

import dlib #no module
import cv2 #no module
import numpy #as np

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('dlib-master/dlib-master/python_examples/shape_predictor_68_face_landmarks.dat/shape_predictor_68_face_landmarks.dat')


#ここに処理を追加
def get_center(gray_img):
    moments = cv2.moments(gray_img, False)
    try:
        return int(moments['m10'] / moments['m00']), int(moments['m01'] / moments['m00'])
    except:
        return None


def is_close(y0, y1):
    if abs(y0 - y1) < 1:
        return True
    return False


def eye_point(img, parts, left=True):
    if left:
        eyes = [
                parts[36],
                min(parts[37], parts[38], key=lambda x: x.y),
                max(parts[40], parts[41], key=lambda x: x.y),
                parts[39],
                ]
    else:
        eyes = [
                parts[42],
                min(parts[43], parts[44], key=lambda x: x.y),
                max(parts[46], parts[47], key=lambda x: x.y),
                parts[45],
                ]
    org_x = eyes[0].x#座標の保存
    org_y = eyes[1].y
    if is_close(org_y, eyes[2].y):
        return None

    eye = img[org_y:eyes[2].y, org_x:eyes[-1].x]
    _, eye = cv2.threshold(cv2.cvtColor(eye, cv2.COLOR_RGB2GRAY), 30, 255, cv2.THRESH_BINARY_INV)

    center = get_center(eye)
    if center:
        return center[0] + org_x, center[1] + org_y
    return center


def p(img, parts, eye):
    if eye[0]:
        cv2.circle(img, eye[0], 3, (255, 255, 0), -1)
    if eye[1]:
        cv2.circle(img, eye[1], 3, (255, 255, 0), -1)

    for i in parts:
        cv2.circle(img, (i.x, i.y), 3, (255, 0, 0), -1)

    cv2.imshow("me1", img)
#    cv2.imshow("me2", frame)

#画像ファイルに保存
    cv2.imwrite("image/test003.png", img);


frame = cv2.imread('image/face002.jpg')#画像の読み込み
#frame = cv2.resize(frame1,(,))#画像の大きさを変更する


dets = detector(frame[:, :, ::-1])
if len(dets) > 0:
    parts = predictor(frame, dets[0]).parts()

    left_eye = eye_point(frame, parts)
    right_eye = eye_point(frame, parts, False)

    p(frame * 1, parts, (left_eye, right_eye))


cv2.waitKey(0)
cv2.destroyAllWindows()

print('left_eye(x,y) =  ', left_eye)
#
print('right_eye(x,y) =  ', right_eye)

val1 = numpy.array([left_eye])
val2 = numpy.array([right_eye])
val3 = numpy.array([parts[33].x,parts[33].y])
val4 = numpy.array([parts[48].x,parts[48].y])
val5 = numpy.array([parts[54].x,parts[54].y])

print('left_eye , right_eye , nose , lmouth , rmouth \n' , val1 ,val2 , val3 ,val4 ,val5)

自分で調べたことや試したこと

出力結果
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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • meg_

    2019/10/17 10:35

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

    キャンセル

  • takahiro_tt

    2019/10/17 11: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 11:48

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

    キャンセル

  • takahiro_tt

    2019/10/17 16:39

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

    キャンセル

回答 3

checkベストアンサー

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/17 23:27

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

    キャンセル

0

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

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

可能なら複数の画像に対して同時に行い
画像ごとの結果をエクセルの縦列ごとに並べて行く予定

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る