Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What is going on with this article?

More than 1 year has passed since last update.

@tkinjo1

ESP32-CAM(MicroPython)からサーバーへ画像をPOSTする

ESP32-CAMを手っ取り早く使うならArduino IDEを使えばいいけど

1、IO0/GNDをショートさせてスケッチを書き込み
2、書き込みが完了したら元に戻して起動

というのがなんとも面倒。

そこで登場するのがMicroPython。

公式ドキュメントから引用

MicroPython は、さまざまなシステムおよびハードウェアプラットフォームで動作します。

ただ現在はESP32-CAMをサポートしていないのでカメラを使うためのライブラリがない。(カメラが使えるカスタムFWがあり今回はそれを使った)
さらにMicroPythonはPythonのサブセットなので一部サポートされていないメソッドやモジュールがある。

requestsのMicroPython版 urequests

MicroPythonにはurequestというライブラリありほとんどrequestsと同じように使うことができる。
インストールも簡単にできる。

import upip
upip.install('urequests')

ただこの方法でインストールしたところ何故がメソッドが呼び出せなかった。
なのでMicroPython公式のリポジトリから引っ張ってきた物をesp32へ転送して使った。
urequest.py
esp32への転送にはampyを使うと簡単。

# ampyのインストール
$ pip install adafruit-ampy

#esp32へのファイル転送
$ ampy -p /dev/tty.<環境に合わせて> put <ファイル>

当初はPythonのrequestsを使う時と同じように、

urequests.post(url, files={'image': open('画像ファイル', 'rb)})

で行けるかと思っていたけどurequestsにはfilesがない。

いろいろ調べた結果、一度JSONにすることで行けそうだとわかった。

buf = camera.capture()
img_byte = base64.b64encode(buf)
img_json = ujson.dumps({"image": img_byte})
res = urequests.post(url, data=img_json)

こちらの記事を参考にしました。
Pythonで画像データをJSONにしてネットワーク越しに送受信する

受け取ったサーバー側(Flask)での処理はこんな感じ

data = request.data.decode('utf-8')
data_json = json.loads(data)
image = data_json['image']
image_dec = base64.b64decode(image)
data_np = np.frombuffer(image_dec, dtype='uint8')
decimg = cv2.imdecode(data_np, 1)
cv2.imwrite(filename, decimg)

とりあえず「ESP32-CAMで撮影した画像をPOSTする」という目的は果たせた。
作ったものはこちら↓
ESP32-CAM_ImagePost

6
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
6
Help us understand the problem. What is going on with this article?