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!

error: (-215) scn == 3 || scn == 4 in function cv::cvtColorというエラーが出てしまう

https://qiita.com/daiarg/items/0fa6759e450c18c502b3#comment-fdaa04d20d12d7b89b67

上記サイトを参考にしてAzreのFaceAPIとOpenCVを使ってカメラを起動しキャプチャした画像から顔を検出し感情推定を行うというプログラムを作成したいのですが、おそらくカメラの起動時かその画像の保存の段階でエラーが起こってしまいます。

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

error: C:\ci\opencv_1512688052760\work\modules\imgproc\src\color.cpp:11048: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor
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)
    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 = datetime.now()#撮影時間
            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)
                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で解析
            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)

windowsでは:が使えないとのことなのでパスしての時に削除しました。

ほかのコードで簡単にカメラ起動を行ってみたところ正常に動きました。

他サイトで以前質問を書いたところdateitme.nowが原因だと回答をいただきましたがどう変えていいのかわからずそのままの状態です。

始めたばかりで何をしたらいいのかわからず苦戦しています。なにか解決方法があれば教えていただきたいです。

開発環境
windwos
anaconda

0

1Answer

ret, img = cap.read()にてimgに正しくカラーイメージがセットされていないようです

0Like

Comments

  1. @kokku

    Questioner

    コードをどのように変えたらいいでしょうか

Your answer might help someone💌