質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.64%

opencvでグレースケール変換時にcvtcolorエラーが出てしまう

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 189

Kokku

score 19

前提・実現したいこと

opencvとAzureのFaceAPIを使いカメラから顔を認識し感情を推定するプログラムを作成したいのですが、実行時、下記のようなエラーが出てしまいます。
ほかの似たプログラムでも同じエラーメッセージが出てしまうのですが調べてみても解決方法がわからず、苦戦しています。なにか解決方法があれば教えていただきたいです。

発生している問題・エラーメッセージ

---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-3-6333100fad90> in <module>
     30 while True:
     31     r, img = cap.read()
---> 32     img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#グレースケールに変換
     33     faces=cascade.detectMultiScale(img_gray, scaleFactor=1.1, minNeighbors=1, minSize=(100, 100))#顔判定 minSizeで顔判定する際の最小の四角の大きさを指定できる。(小さい値を指定し過ぎると顔っぽい小さなシミのような部分も判定されてしまう。)
     34 

error: C:\ci\opencv_1512688052760\work\modules\imgproc\src\color.cpp:11048: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor


​

該当のソースコード

import cognitive_face as CF
import json

#####################
import requests
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)
data_name = ["anger","contempt","disgust","fear","happiness",'sadness','surprise']#保存データの系列
emotion_data =[0,0,0,0,0,0,0]#初期値
count = 0#撮影回数を示すカウンタ


##顔認識の設定
cascade_path =  'E:\opencvcascade/haarcascade_frontalface_alt.xml'# 顔判定で使うxmlファイルを指定する。(opencvのpathを指定)
cascade = cv2.CascadeClassifier(cascade_path)

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

##実行
while True:
    r, img = cap.read()
    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 = str(now)+'.jpg'#保存するfilename
            #cv2.imwrite(filename, img)#画像の書き出し

            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()#グラフを閉じる



##############################


#KEY = 'c5a1c742742b41f780a74a29b0297dd1'
#ENDPOINT = 'https://shota0720.cognitiveservices.azure.com/face/v1.0'

#CF.Key.set(KEY)
#CF.BaseUrl.set(ENDPOINT)

img = filename
faces = CF.face.detect(img, attributes='emotion')
f=json.dumps(faces)
j=json.loads(f)

print(len(j))
for i in range(0,len(j)):
    print(j[i]['faceAttributes']['emotion'])

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

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

開発環境
windows10
anaconda

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • yuki23

    2020/09/29 00:31

    どこかからコピペしたコードですね? 引用元を示してください

    キャンセル

  • Kokku

    2020/09/29 00:51

    補足情報に追記しました。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る