前提・実現したいこと
openCVを使って取得した画像を保存せずにAzureのfaceAPIに通して感情の値を取得したいです。
発生している問題・エラーメッセージ
faceAPIからの以下のエラーが出ています。
"error": {
"code": "InvalidImage",
"message": "Decoding error, image format unsupported."
これはfaceAPIからのエラーなので、faceAPIを通すところまではうまくいっているのですが、おそらく画像のフォーマットがダメなんだと思います。
また、取得した画像を個別にfaceAPIに通したら、数値が返ってきたので、取得した画像の問題でも無いと思います。
該当のソースコード
import cv2 import os import datetime import time import http.client, urllib.request, urllib.parse, urllib.error, base64 import json import numpy as np headers = { # 'Content-Type': 'application/json', 'Content-Type': 'application/octet-stream', 'Ocp-Apim-Subscription-Key': '######################', } params = urllib.parse.urlencode({ 'returnFaceId': 'false', # 'returnFaceLandmarks': 'true', 'returnFaceAttributes': 'emotion' }) cap = cv2.VideoCapture(0) os.makedirs("data/temp", exist_ok=True) n = 0 i = 0 while True: ret, frame = cap.read() cv2.imshow('frame', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break time.sleep(3) i = i + 1 body = frame.tobytes() try: conn = http.client.HTTPSConnection('westus2.api.cognitive.microsoft.com') conn.request("POST", "/face/v1.0/detect?%s" % params, body, headers) response = conn.getresponse() data = json.loads(response.read()) print(json.dumps(data, indent=4)) conn.close() except Exception as e: print("[Errno {0}] {1}".format(e.errno, e.strerror)) cv2.destroyWindow('frame')
試したこと
OpenCVで取得したデータの型はndarray.unit8でFaceAPIで求められるデータの型はbytesだったので、tobyteでbyte型に変換しました。
また、取得後の画像のデータは640×480の104KBで、FaceAPIの許容内でした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。