LoginSignup
6
6

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-03-15

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
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6