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

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

ただいまの
回答率

87.59%

VideoCaptureした画像をバイナリ形式に変換したい

解決済

回答 1

投稿

  • 評価 0
  • クリップ 0
  • VIEW 1,986

前提・実現したいこと

Webカメラから取得した写真をAWSのRekognitionで顔照合をするプログラムを作っています。

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

opencvのVideoCaptureで得られた画像をAWS APIに投げる際に画像の形式を
numpyからbinaryに変換をしないといけないのですが、うまく変換を行うことができません。
numpy.ndarray.tobytes
上記サイトを参考に変換をしてみたところ、変換後のbinaryが\x00\x00...\x00\x00で
埋め尽くされてしまい中身のない状態となってしまいます。

該当のソースコード

import numpy
import cv2 as cv

cap = cv.VideoCapture(0)
rr,frame = cap.read()
b_frame = numpy.ndarray.tobytes(frame)
"""
Amazon Rekognitionの処理
"""
cap.release()

試したこと

b_frame = io.BytesIO(frame)
も使ってみましたが
<_io.BytesIO object at 0x0000029F4BAFFF68>
となりダメでした。
よろしくお願いいたします。

  • クリップを取り消します

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

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

回答 1

checkベストアンサー

0

numpy.ndarray.tobytesはnumpy配列をbytes形式に変換するものであり、APIで必要とされているのは画像ファイルをbytes形式にしたものであると考えられます。

なので以下の例のようにPILを使ってnumpy配列をpng(もしくはjpeg)形式でio.BytesIOオブジェクトに保存して、それをbytes形式で読み取るという方法はいかがでしょうか。

import numpy as np
import cv2
import io
from PIL import Image

cap = cv.VideoCapture(0)
rr, frame = cap.read()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # cv2の画像はBGRなのでRGBに変換
image = Image.fromarray(frame)
png = io.BytesIO() # 空のio.BytesIOオブジェクトを用意
image.save(png, format='png') # 空のio.BytesIOオブジェクトにpngファイルとして書き込み
b_frame = png.getvalue() # io.BytesIOオブジェクトをbytes形式で読みとり

"""
Amazon Rekognitionの処理
"""

cap.release()

投稿

tkymtmt

score 143

  • ayatsuji_uchu

    ayatsuji_uchu

    2019/12/27 10:23

    おかげさまで無事解決することができました!
    ありがとうございます。

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

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

関連した質問

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