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!

FaceAPIとOpenCVを使ってカメラから感情推定のプログラムを作りたい

https://qiita.com/yujiyam/items/1cf1a41b93c076fb5a9b

https://qiita.com/daiarg/items/0fa6759e450c18c502b3#comments

こちらのサイトで似たような記事を見つけて自分のパソコンで動かそうとしたのですが
エラーが出てしまいます。
どちらもカメラの起動、、保存、読み込みの時にエラーが起きているのですが初心者でどこがエラーの原因になっているのかがわからず解決方法も見つけられていません。なにか解決方法があれば教えていただきたいです。

開発環境

windows10
anaconda
python
opencv
FaceAPI

api.py
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カメラにできる
#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'C:\Users\shota\opencvcascade\haarcascade_frontalface_alt.xml'# 顔判定で使うxmlファイルを指定する。(opencvのpathを指定)
cascade = cv2.CascadeClassifier(cascade_path)

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

##実行
while True:
    ret, img = cap.read()
    print(1)
    assert img is not None, 'cannot open file as img.'
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#グレースケールに変換
    faces=cascade.detectMultiScale(img_gray, scaleFactor=1.1, minNeighbors=1, minSize=(100, 100))#顔判定 minSizeで顔判定する際の最小の四角の大きさを指定できる。(小さい値を指定し過ぎると顔っぽい小さなシミのような部分も判定されてしまう。)

    if len(faces) > 0: #顔を検出した場合
        for face in faces:
            now = datetime.now()#撮影時間
            filename = r"C:\Users\shota\opencvcascade\img "+str(now)+'.jpg'#保存するfilename
            cv2.imwrite(filename, img)#画像の書き出し

            with open(filename, mode="rb") as image_data:#処理をする画像を選択
                content = image_data.read()
                print(2)
                assert img is not None, 'cannot open file as img2.'
                print(content)


            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ファイルとして書き出し

1
1
1
1
1
1
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-1-fa3495898dc2> in <module>
     38             cv2.imwrite(filename, img)#画像の書き出し
     39 
---> 40             with open(filename, mode="rb") as image_data:#処理をする画像を選択
     41                 content = image_data.read()
     42                 print(2)

OSError: [Errno 22] Invalid argument: 'C:\\Users\\shota\\opencvcascade\\img 2020-09-30 21:06:10.640920.jpg'

カメラは内蔵のものです。再起動しても変化なしでした。

0

2Answer

OpenCVを利用しようとしているときに、
別のソフトがカメラをすでに使っていたりしませんか?
不要なソフトはすべて終了したりOSを再起動して再度挑戦してみてください。

それでも治らなければエラーメッセージや
画面キャプチャーなどを貼り付けてください。

また、カメラはノートパソコン内蔵のものなのか、USB接続のカメラなのか、
型番もわかれば良いと思います。

0Like

Comments

  1. @kokku

    Questioner

    追記しました。感情の推定画面が表示されればいいと思っているのでpoltもcsvファイルも取り除きたいと思っています。なのでそれらが原因の部分でありそうならば削除できますのでご指摘お願います。
  2. @kokku

    Questioner

    具体的にどの記号に変えたらいいのでしょうか。
  3. datetime.now() が原因です。置換せずに
    : を削除するだけで良いと思います。
  4. @kokku

    Questioner

    now =datetime.now()

    どう書いたらいいでしょうか。なんども質問すいません。

now =datetime.now()をnow = 1にしてfilenameの後にnow += 1とかにしたらいいですかね?

0Like

Your answer might help someone💌