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

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

ただいまの
回答率

87.49%

ValueError: I/O operation on closed file というエラーが出てしまう。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 736

score 26

リンク内容
このサイトを参考にして自分のパソコン環境でも動くようにしたいと思い少しずつ改変していっいるのですが、

9\x11@\x1d\xd6f\x1bO\\\x0c\x1c\xf5\x185\xcek\x9e6\xbe\xbe\x9f\xca\x02G\xc6\xe2\x1d$}\xee\xd9%\x8b\x00\xdc\x8e2O\xd7\x8a\xa0\x9a6\xbfw\x033\'\xca\xd9\x92GT?+`\x809\xfa\x8c\x91\xfe5\xa3\xa5\xf8v\xd2\x00\xbet{\xb6\x1d\xcd+7\\uS\x8fa\xeb\xff\x00\xd

このような文字がいっぱい続いてました。

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-1-4b147de06743> in <module>
     53                 }
     54                 response = requests.post(face_api_url, headers=headers,
---> 55                                         params=params, data=image_data)#FaceAPIで解析
     56 
     57                 response.raise_for_status()

E:\Anaconda\envs\env\lib\site-packages\requests\api.py in post(url, data, json, **kwargs)
    117     """
    118 
--> 119     return request('post', url, data=data, json=json, **kwargs)
    120 
    121 

E:\Anaconda\envs\env\lib\site-packages\requests\api.py in request(method, url, **kwargs)
     59     # cases, and look like a memory leak in others.
     60     with sessions.Session() as session:
---> 61         return session.request(method=method, url=url, **kwargs)
     62 
     63 

E:\Anaconda\envs\env\lib\site-packages\requests\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    514             hooks=hooks,
    515         )
--> 516         prep = self.prepare_request(req)
    517 
    518         proxies = proxies or {}

E:\Anaconda\envs\env\lib\site-packages\requests\sessions.py in prepare_request(self, request)
    457             auth=merge_setting(auth, self.auth),
    458             cookies=merged_cookies,
--> 459             hooks=merge_hooks(request.hooks, self.hooks),
    460         )
    461         return p

E:\Anaconda\envs\env\lib\site-packages\requests\models.py in prepare(self, method, url, headers, files, data, params, auth, cookies, hooks, json)
    315         self.prepare_headers(headers)
    316         self.prepare_cookies(cookies)
--> 317         self.prepare_body(data, files, json)
    318         self.prepare_auth(auth, url)
    319 

E:\Anaconda\envs\env\lib\site-packages\requests\models.py in prepare_body(self, data, files, json)
    476         if is_stream:
    477             try:
--> 478                 length = super_len(data)
    479             except (TypeError, AttributeError, UnsupportedOperation):
    480                 length = None

E:\Anaconda\envs\env\lib\site-packages\requests\utils.py in super_len(o)
    118     elif hasattr(o, 'fileno'):
    119         try:
--> 120             fileno = o.fileno()
    121         except io.UnsupportedOperation:
    122             pass

ValueError: I/O operation on closed file

​


というエラーが出てしまいます。
保存する画像名の指定の仕方が悪いのか保存されないです。
少し調べたことろファイルが開かれてないのに編集しようとしているからこのエラーが起こる?みたいなことが書かれていたのですが本当の原因がこれなのかわかりません。

実行したことは画像が保存されるごとに画像の名前を変えて保存したいです。
そのためにdatetime.now()の箇所を変えないといけないのですがどう変えていいのかわからず質問させていただきました。

import requests
import json
import time
import numpy as np
import cv2
from datetime import datetime
import matplotlib.pyplot as plt
import pandas as pd

##初期設定
cap=cv2.VideoCapture(0) #0にするとmacbookのカメラ、1にすると外付けのUSBカメラにできる
lastflame = None
csv_name = datetime.now().strftime('%Y%m%d_%H%M')#csvファイルとして保存するファイル名
data_name = ["anger","contempt","disgust","fear","happiness",'sadness','surprise']#保存データの系列
emotion_data =[0,0,0,0,0,0,0]#初期値
count = 0#撮影回数を示すカウンタ

##顔認識の設定
cascade_path =  r'haarcascade_frontalface_alt.xml'# 顔判定で使うxmlファイルを指定する。(opencvのpathを指定)
cascade = cv2.CascadeClassifier(cascade_path)

##Faceの設定
subscription_key = '####################'#ここに取得したキー1を入力
assert subscription_key
face_api_url = 'https://#######.cognitiveservices.azure.com/face/v1.0/detect'#ここに取得したエンドポイントのURLを入力

##実行
while True:
    ret, img = cap.read()
    if ret == True:
        img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#グレースケールに変換
        faces=cascade.detectMultiScale(img_gray, scaleFactor=1.1, minNeighbors=1, minSize=(100, 100))#顔判定 minSizeで顔判定する際の最小の四角の大きさを指定できる。(小さい値を指定し過ぎると顔っぽい小さなシミのような部分も判定されてしまう。)
        cv2.imshow('image',img_gray)
        if lastflame is None:
            lastflame = img_gray.astype('float')
            cv2.imshow('image',img_gray)
        if len(faces) > 0: #顔を検出した場合
            for face in faces:
                now = 1#撮影時間
                filename = "face{}.jpg".format(now)#保存するfilename
                cv2.imwrite(filename, img)#画像の書き出し
                with open(filename, mode="rb") as image_data:#処理をする画像を選択
                    content = image_data.read()
                    print(content)
                now += 1

                headers = {'Ocp-Apim-Subscription-Key': subscription_key,
                       'Content-Type': 'application/octet-stream'}
                params = {
                'returnFaceId': 'true',
                'returnFaceLandmarks': 'false',
                'returnFaceAttributes': 'age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise',
                }
                response = requests.post(face_api_url, headers=headers,
                                        params=params, data=image_data)#FaceAPIで解析

                response.raise_for_status()
                analysis = response.json()#json出力

            #faceのjsonから抽出する項目をピック
                result = [analysis[0]['faceAttributes']['emotion']['anger'],analysis[0]['faceAttributes']['emotion']['contempt'],
                        analysis[0]['faceAttributes']['emotion']['disgust'],analysis[0]['faceAttributes']['emotion']['fear'],
                        analysis[0]['faceAttributes']['emotion']['happiness'],analysis[0]['faceAttributes']['emotion']['sadness'],
                        analysis[0]['faceAttributes']['emotion']['surprise']]

                emotion_data = np.array(result) + np.array(emotion_data)

                df = pd.DataFrame({now:emotion_data},
                            index=data_name)#取得データをDataFrame1に変換しdfとして定義

                if count == 0:#初期
                    print(df)

                else:
                    df = pd.concat([df_past,df],axis = 1, sort = False)#dfを更新
                    print(df)


                plt.plot(df.T)#dfの行列を反転
                plt.legend(data_name)#凡例を表示
                plt.draw()#グラフ描画
                plt.pause(4)#ウェイト時間(=Azure更新時間)
                plt.cla()#グラフを閉じる

                count = count + 1#撮影回数の更新
                df_past = df#df_pastを更新

                df.T.to_csv(csv_name+'.csv')#感情分析結果をcsvファイルとして書き出し

開発環境
windows10
anaconda
opencv
faceapi
python

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

Windowsではコロン:はファイル名に使えません。
削除するか別の文字にしましょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/10/12 07:56

    > 今回ですとグラフの更新が13回目の時にIndexErrorが起こったのですがこれは取得した画像によって変わってくるということでしょうか。

    そんなこと知りませんよ。

    > また、このエラーの回避方法などはありますでしょうか。。

    回避だけで良いなら、空なら処理をやめれば?

    キャンセル

  • 2020/10/12 07:58

    いずれにせよ、何をしているプログラムか理解せずに動かすのは無理なので、理解しましょう。

    キャンセル

  • 2020/10/12 17:05 編集

    空の時にエラー処理をするのではなく五回で終了させるという風に変えました。
    若干の修正点はまだあるもののとりあえず動くようになりました。本当にありがとうございました。

    キャンセル

0

OSError: [Errno 22] Invalid argument: 'face2020-10-11 19:42:50.885527.jpg

ファイル名に使えない文字が入ってます。
本当にそういう名前のファイルがあるんですか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/10/11 20:55

    載せるコードなどが間違っていたので編集しました。

    キャンセル

  • この投稿は削除されました

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

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

関連した質問

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