以前、
ラズパイ上でのlibcameraの使い方を記事にしました。
とりあえず動くようになったのですが、魚眼のimx219など一部カメラでは色合いが
おかしくなります。
赤外線フィルターが入っていないカメラを屋外で使うと同じようにピンク色になってしまう
のですが、屋内で使っていてもおかしい場合はチューニングファイルを指定すると改善します。
参考:Zenn@horie-t様
Raspberry Pi 5にカメラを接続するArducamが
チューニングファイルを公開しているのでこれをダウンロードして、
任意の場所に保管します。今回は
/usr/local/share/libcamera/ipa/rpi/pisp/にその他チューニングファイルが保管されていたので一緒に入れました。
以下はダウンロードしたファイルを
pi5_imx219_120d.jsonとした場合の説明です。
libcamera-helloや
rpicam-helloであれば実行時にこのファイルを
libcamera-hello --tuning-file /usr/local/share/libcamera/ipa/rpi/pisp/pi5_imx219_120d.jsonの様に指定すると色合いが改善します。
また、pythonでpicamera2を使用している場合は専用の関数が用意されている様です。
参考:Zenn@horie-t様
Picamera2で魚眼レンズカメラ(Arducam 8MP IMX219)のカメラレンズシェーディング補正をする
環境変数でチューニングファイルを指定
問題はここから
C言語などを使った自作プログラムの場合
--tuning-fileのような指定ができません。
export LIBCAMERA_TUNING_FILE=ファイル
の様に環境変数を指定すれば良いとの情報も出てきたのですが、うまく適用できません。
libcameraの公式情報を見ると
LIBCAMERA_<NAME>_TUNING_FILE
との記載があります。
これをcopilotに解説してもらうと<NAME>の部分にパイプハンドラを指定する必要があり、
ラズパイの場合は
LIBCAMERA_RPI_TUNING_FILEとなる様です。これに従ってターミナルで
export LIBCAMERA_RPI_TUNING_FILE=/usr/local/share/libcamera/ipa/rpi/pisp/pi5_imx219_120d.jsonと実行した後で、
同じターミナルでlibcamera-helloを実行すれば
--tuning-file以外でも
チューニングファイルを指定できます。
同様に
同じターミナルであれば自作プログラムにもチューニングファイルが適用されます。
ただし、環境変数を設定したのとは
違うターミナルでプログラムを実行しても反映されず、
ターミナルを開き直すたびにリセットされてしまいます。
また、pythonでpicamera2を使用している場合はこの環境変数が適用されない様なので注意が必要です。
C言語プログラム上で指定する
本来は.bashrcとかに記載しておけばいいらしいのですが、今回はプログラム上から指定
してみます。
setenv関数を使えば環境変数を指定できるので、
#include <stdlib.h>で機能を読み込んでおいて、メイン関数の冒頭(libcameraの初期化前の時点)で
setenv("LIBCAMERA_RPI_TUNING_FILE", "/usr/local/share/libcamera/ipa/rpi/pisp/pi5_imx219_120d.json", 1);を実行すればそのプログラムだけにチューニングファイルを指定できるようになります。
もっと簡単に
ダウンロードしたファイルを個別に指定しましたが、自分の環境ではどうやら
/usr/local/share/libcamera/ipa/rpi/pisp/
フォルダにあるカメラ型式と同名のファイルを自動で読み込んでいるらしく、
既存の
imx219.jsonを
imx219_olg.json等に名称変更しておき、
ダウンロードした
pi5_imx219_120d.jsonを
imx219.jsonとすれば個別指定しなくても
自動的に適用されます。
カメラを復習種類接続している場合や同じ素子だけど画角が違うカメラが混在している
場合など使い分けてください。