質問: 仕様書によると5Mのカメラモジュールを使っているはずなのですが、下記の質問では、「CAM_IMGSIZE_5Mは利用できない」、ということが書いてありました。 Spresense CAM_IMGSIZEについて しかし、私の環境では、CAM_IMGSIZE_5Mだけでなく、CAM_IMGSIZE_FULLHD_H(V) を指定しても、img.isAvailable()で失敗します。 CAM_IMGSIZE_QUADVGAでは撮影ができます。 他にも数多くの解像度が定義されているのですが、オプションのカメラモジュールでは、どの解像度だと利用可能でしょうか。
回答: setStillPictureImageFormat()にCAM_IMGSIZE_FULLHD_H,Vを指定した時点でメモリ不足のエラーが返ってきます。 JPEGを保存するためのメモリが確保できていないようなので、ライブラリの中をみてみました。Camera.cppの ImgBuff::calc_img_size()でバッファサイズが決められていて ``` size_t ImgBuff::calc_img_size(int w, int h, CAM_IMAGE_PIX_FMT fmt) { ... case CAM_IMAGE_PIX_FMT_JPG: // In SPRESENSE SDK, JPEG compression quality=80 by default. // In such setting, the maximum actual measured size of JPEG image // is about width * height * 2 / 9. // Therefore, devide by JPG_COMPRESS_RATIO = 7 with margin. ret = (size_t)(w * h * 2 / JPG_COMPRESS_RATIO); break; ``` ここの `JPG_COMPRESS_RATIO` がデフォルト (7)。 FULLHDのときに計算すると、1920 x 1080 x 2 / 7 ≒ 約579KB。 JPEG圧縮率にも依存しますが、ちょっとマージンを取り過ぎている気がします... 試しにJPG_COMPRESS_RATIO を 11 とかに変更すると、FULLHD でも問題なく撮影できました。JPG_COMPRESS_RATIO を 24 とかに変更すると、CAM_IMGSIZE_5M_H,V でも撮影できました。 ちなみに動画のプレビューが不要であれば、begin()に0を渡すことでその分のメモリ確保も削減することができるようです。 ``` err = theCamera.begin(0); ``` 撮影対象にも依存するとは思いますが、参考になれば。