

opencvとFaceAPIを使ってカメラから画像を取得し感情推定するプログラムを作ろうと思っているのですが、下記コードを実行すると画像が読み込めないというエラーが出てしまいます。

[python opencvでグレースケール変換を行いたい -
teratail](https://teratail.com/questions/134267)

このサイトを参考にしてみたのですが実行結果は変わりませんでした...  
何が原因なのかもわからず検索もできないため、詰まっています。なにか解決方法があれば教えていただきたいです。

実行プログラム

[code]

    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 = '#########################'#ここに取得したキー１を入力
    assert subscription_key
    face_api_url = '#################################3/face/v1.0/detect'#ここに取得したエンドポイントのURLを入力
    
    ##実行
    while True:
        r, img = cap.read()
        #cv2.imwrite(r"C:\Users\shota\opencvcascade\img " + str(now) + '.jpg')
        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 = 1#撮影時間
                filename = r"C:\Users\shota\opencvcascade\img "+str(now)+'.jpg'#保存するfilename
                cv2.imwrite(filename, img)#画像の書き出し
                now += 1
                image_data = open(filename, "rb").read()#処理をする画像を選択
                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ファイルとして書き出し ```
    
[/code]

エラー画面

[code]

    ---------------------------------------------------------------------------
    AssertionError                            Traceback (most recent call last)
    <ipython-input-14-1e1e4e967c4d> in <module>
         28     r, img = cap.read()
         29     #cv2.imwrite(r"C:\Users\shota\opencvcascade\img " + str(now) + '.jpg')
    ---> 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で顔判定する際の最小の四角の大きさを指定できる。(小さい値を指定し過ぎると顔っぽい小さなシミのような部分も判定されてしまう。)
    
    AssertionError: cannot open file as img.
    
[/code]

引用元  
[AzureのFaceを使ってリアルタイム感情分析をしてみた -
Qiita](https://qiita.com/daiarg/items/0fa6759e450c18c502b3)  
[Azure Face API で写真から感情判定 -
Qiita](https://qiita.com/doyodoyo/items/bb0f20a1076fce9a8de6)

pyplotが必要ないと思ったので二個目のサイトの”まずはmacで試してみる”というコードと一個目のサイトのコードをくっつけてプログラムを完成させたいと思い試行錯誤していました。

開発環境  
windows10  
anaconda


CC BY-SA 4.0
2020-09-29T10:50:38.970
70811
2020-09-29T12:28:31.180
2020-09-29T12:28:31.180
3060
40930
question
python windows api opencv azure
Opencvのグレースケール変換時にエラーが起きてしまう。