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

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

新規登録して質問してみよう
ただいま回答率
85.35%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

Q&A

解決済

1回答

1976閲覧

OpenCVで取得した画像をazureのFaceAPIで処理したい

tani0729

総合スコア1

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

0グッド

1クリップ

投稿2021/04/08 20:50

前提・実現したいこと

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の許容内でした。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

python

1... 2 body = frame.tobytes() 3...

python

1... 2 ret, body = cv2.imencode('.bmp', frame, []) 3...

に変更してみてください。(エラー処理は省略しています。)

入力データ には下記のように書かれています。

サポートされている入力画像形式は、JPEG、PNG、GIF (最初のフレーム)、BMP です。

Python

1 ret, frame = cap.read()

した時点では、frameはOpenCVの内部形式(?どのように持っているかはソース見つけられませんでした)なので、交換可能な一般的な画像の形式に変換してあげることでFaceAPIが解釈できるようになるはずです。

投稿2021/04/09 03:52

yskszk63

総合スコア161

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問