OpenCVとAzureのFaceAPIを使ってカメラから顔を検知し感情を推定するプログラムを完成させたいのですが、コードを実行するとこのようなエラーが出てしまいます。
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 = 'c5a1c742742b41f780a74a29b0297dd1'#ここに取得したキー1を入力 assert subscription_key face_api_url = 'https://https://shota0720.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で顔判定する際の最小の四角の大きさを指定できる。(小さい値を指定し過ぎると顔っぽい小さなシミのような部分も判定されてしまう。) print(2) if len(faces) > 0: #顔を検出した場合 for face in faces: now = 1#撮影時間 filename = r"C\Users\shota\opencvcascade\img "+str(now)+'.jpg'#保存するfilename cv2.imwrite(filename, img)#画像の書き出し print(3) with open(filename, mode="rb") as image_data:#処理をする画像を選択 content = image_data.read() print(4) assert img is not None, 'cannot open file as img2.' 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で解析 print(5) response.raise_for_status() analysis = response.json()#json出力 print(6) #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) print(7) else: df = pd.concat([df_past,df],axis = 1, sort = False)#dfを更新 print(df) print(8) plt.plot(df.T)#dfの行列を反転 plt.legend(data_name)#凡例を表示 plt.draw()#グラフ描画 plt.pause(4)#ウェイト時間(=Azure更新時間) plt.cla()#グラフを閉じる print(9) count = count + 1#撮影回数の更新 df_past = df#df_pastを更新 df.T.to_csv(csv_name+'.csv')#感情分析結果をcsvファイルとして書き出し print(10)
1 --------------------------------------------------------------------------- error Traceback (most recent call last) <ipython-input-1-c94dff02e2d2> in <module> 30 assert img is not None, 'cannot open file as img.' 31 img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#グレースケールに変換 ---> 32 faces=cascade.detectMultiScale(img_gray, scaleFactor=1.1, minNeighbors=1, minSize=(100, 100))#顔判定 minSizeで顔判定する際の最小の四角の大きさを指定できる。(小さい値を指定し過ぎると顔っぽい小さなシミのような部分も判定されてしまう。) 33 print(2) 34 if len(faces) > 0: #顔を検出した場合 error: C:\ci\opencv_1512688052760\work\modules\objdetect\src\cascadedetect.cpp:1698: error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale
いろいろなサイトを見て自分の環境にあったように少し改変しています。
初心者でどの部分を変更すれば直るのかがわからず悩んでいます。
解決法などがあれば教えていただきたいです。
今出ているエラー
ファイル指定しても保存できない。これをするだけでいい?→(windowsでは:を指定できないので削除。)
カメラの読み込み、保存時にcvtcolorエラーがでている。
保存はできているがファイルを見ると0バイトになっている。
開発環境
windows
anaconda
opencv
FaceAPI
あなたの回答
tips
プレビュー