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

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

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

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

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

1回答

2555閲覧

RaspberryPi 顔認識 Web配信

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

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

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2017/01/23 05:08

###前提・実現したいこと
RaspberryPi2 モデルBにてpiCameraで撮影している画像をリアルタイムでWeb表示したい。
web側に画像を送る前に顔認識をして顔周辺を囲い、画像処理後の画像を送信したい。

同じネットワーク間でのみ使用しますのでセキュリティはあまり気にしていません。

現在、画像処理を加えない画像の送信およびWeb表示は成功しています。
速度は10fpsで行っています。

piCameraで撮影している画像を
stream = io.BytesIO()に入れて
WebSocket(tornado)を使用しHTMLに送っています。

ここで画像処理を加えようとすると問題が発生しました。
通常piCameraで画像処理を加える場合は
picamera.array.PiRGBArrayのようにNumPy配列を使い

python

1stream = picamera.array.PiRGBArray(camera) 2camera.capture(stream,'bgr',use_video_port=True) 3gray = cv2.cvtColor(stream.array, cv2.COLOR_BGR2GRAY)

のように処理すると思います。
ただ、WebSocket(tornado)で送ろうとする場合

python

1write_message(message, binary=False)

を使用しますが、これはバイナリか文字列しか送ることが出来ません。
画像処理を加わえる場合はNumPy配列となってしまい送信することが出来ません。

どうゆう処理を加えたら顔認識をした画像をWebSocket(tornado)で送信することができますか?

###発生している問題・エラーメッセージ
画像処理をするときと送信するときのデータの型の衝突
画像処理をするときの画像はNumPy配列
送信するメソッドが扱えるのはバイナリまたは文字データ(UTF-8)

TypeError : Expected bytes, unicode,or None; got <class 'picamera.array.PiRGBArray'>

###該当のソースコード

問題発生部のみ抽出

python

1camera = picamera.PiCamera() 2camera.resoltion = (WIDTH, HIGHT) 3camera.framerate = FPS 4time.sleep(2) 5stream = io.BytesIO() 6 7for foo incamera.capture_continuous(stream,'jpeg',use_video_port = True): 8 write_message(stream.read(),binary = True) 9 stream.seek(0) 10 stream.truncate()

受け取り側のHTMLファイル

画像撮影側

javaScript

1ws = new WebSocket("ws://000.000.0.000:0000"); 2ws.binaryType = 'Blob' 3ws.onmessage=function(e){ 4 var data = e.data; 5 var blob_url = window.URL.createObjectURL(); 6 img.src = blob_url; 7}
###補足情報(言語/FW/ツール等のバージョンなど) raspbian,python2.7 ,tornado,HTML5, openCV2.7

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

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

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

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

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

guest

回答1

0

ベストアンサー

cv2.imwrite() してから struct.pack()しして送れば良いように思います。

投稿2017/01/23 06:58

MasashiKimura

総合スコア1150

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

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

退会済みユーザー

退会済みユーザー

2017/01/25 12:02

cv2.imwrite()でhomeディレクトリなどに保存し、それを読み込みstruct.pack()して送るといった感じでしょうか? struct.pack()のフォーマットですが、文字列の場合は文字数を指定するとあります。この場合は文字列の長さを取得し指定してやらなければならないのでしょうか? 基本的な知識の質問となると思いますがよろしくお願いします。
MasashiKimura

2017/01/25 23:31

そういえば、バイナリを遅れるのでしたね。 cv2.imencode() すればそのまま送れるかもしれません。 structpackする場合は1バイトずつ行えば良いと思います。
退会済みユーザー

退会済みユーザー

2017/01/26 12:28

res,frame = cv2.imencode('.jpg',stream.array) をしてからframeを送ろうとすると、 TypeError:Expected bytes,unicode, or None; got <type 'numpy.ndarray'> とエラーがでました。 これは正しくencode出来ていないのでしょうか?
退会済みユーザー

退会済みユーザー

2017/01/26 13:38

Numpyのリファレンスを読んでみるとtobytes()はありますが、実際に使ってみるとこのメソッドは持っていないとエラーが出ました。 代わりにtostring()が使えました。 リファレンスによるとtostring()もバイトデータを返すようです。 おかげ様でバイナリとして送信することが出来ました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問