FaceAPIとOpenCVを使ってカメラから感情推定のプログラムを作りたい
Q&A
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