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