Arduino用のJPEGデコードライブラリを作成しました。
経緯
とあるイベントに参加した際に、シリアル経由でJPEGデータが送られてくるカメラモジュールを頂きました。
とりあえずSDカードに記録するのは簡単に出来ました。それだけでは面白くありませんので、何かに活用できないかと思いますが、画像データに展開するにはJPEGデコーダが必要になります。
“arduino jpeg decoder”あたりで検索すれば既存のものがすぐ見つかるかと思いましたが、意外に無いものです。やはり8bitマイコンでは荷が重い処理ということでしょうか。
とはいえ、実例の動画であったのでムリじゃないはずだと探した所、ズバリのソースはなかったものの、picojpegというPICなどで実績のあるデコーダがあることが分かりました。これを使うことにします。
ライブラリ作成
サンプルのソースでは、画像1枚分全てのメモリを確保して展開していましたが、ターゲットとしているArduinoや互換機はそこまでRAMが無いことがありますので、1ブロック分(8×8〜16×16ピクセル)のみメモリを確保して処理することにしました。
Arduino用のライブラリにしたかったのでクラス化しています。しかし、デコーダから呼ばれるコールバック関数をクラスのメンバ関数にすることが出来ませんでした。staticにすれば出来るのですが、こんどはメンバ変数にアクセス出来ません。仕方ないのでグローバルなポインタ変数にクラスのアドレスを格納してからそこから呼び出すようにしています。このため、実質インスタンスは1つしか作れないという残念な形になっていますが実害は無いと思います。
完成…?
一応出来ました。ただ、picojpegは最大2.3KBのワークメモリが必要ということで、RAMが2KBのArduino UNOでは動作しません。MEGAやDueなどがターゲットになりますが、所有していないので実はArduino実機でのテストはしていません。(誰かしてくれると嬉しい…)
確認にはArduino互換のGR-KURUMIを使っています。
SDカードから読み込みつつデコードして、シリアルからCSVを出力してみました。その後で、PC上でCSVからJPEGにするツールを使って再現して確認しました。
ライブラリはこちらで公開しています。
https://github.com/MakotoKurauchi/JPEGDecoder
パブリックドメインで公開しているのでご自由にお使いください。使ったらコメントをくれると嬉しいです!
GR-SAKURAでLCDに表示
GitHubで公開しているものはシリアルにCSVを出力しているものなので見た目に面白くありません。
そこでaitendoで販売されているGR-SAKURA用のカラーLCDで表示するようにしてみました。
LCD駆動にはこちらで公開されているサンプルを使わせて頂きましたが、V1.xx(RXduino)ベースなのでJPEGデコードライブラリにちょっと修正が必要でした。
無事表示されてめでたしめでたし。
Arduino for ESP8266で動作させることができました。ありがとうございます!
初めまして。
JPEGDecoder 使わせていただきました。
バッチリ動作しました。
ただ、連続動作できなかったので、関数を少々付け足しました。
これのおかげでスマホ画像をOLEDに表示させることができました。
ありがとうございました。
このページのリンクを貼らせていただきましたので、よろしくお願いいたします。
コメントありがとうございます!
連続動作ですか、その辺はあまり考えてなかったかも知れません…汗
こんにちわ、はじめまして
ESP8266でJPEG展開できてビックリ喜んでいます。
あと JPEGDecoder::pjpeg_callback に return の記述を追加すると
ESP32でも動作しました。