kokku
@kokku

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

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

https://qiita.com/daiarg/items/0fa6759e450c18c502b3#comments
このサイトを参考にして自分のパソコン環境でも動くようにしたいと思い少しずつ改変していっいるのですが、
``
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)
in
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
0

No Answers yet.

Your answer might help someone💌