ラベル V4L2 の投稿を表示しています。 すべての投稿を表示
ラベル V4L2 の投稿を表示しています。 すべての投稿を表示

2014年5月20日火曜日

ウェブカメラのフォーカス

新しいウェブカメラを買いました。LogicoolのC920t。実勢で一万円ほどする高級ウェブカムですよ。Raspberry PiとかUDOOとかのARMシングルボードコンピュータとつなげて遊ぶウェブカムとしては、もともと持っていたバッファローのBSW32KM01Hを使っていたんですが、最近マクロ寄りの距離でタイムラプスを撮りたいとこっそり妄想していて、それができそうなウェブカムを探していたのです。
C920tは価格.comのWebカメラランキングでも上位にあるのですぐにアンテナにかかりましたが、決め手は
  • 最短7cmのとってもマクロな焦点距離
の他にも、
  • UVC対応
  • ハードウェアH.264エンコード
  • 海外のウェブカムハックでよく話に挙がっている
  • 三脚雲台ネジ穴
といったところがあります。ついでに言うと、「カールツァイスレンズ搭載」というのもこの製品の売りだそう。

さっそくボードにつないで実験してみるわけですが、ARMボードでの使用となれば、早々簡単にはいかない。uvccaptureで静止画撮影してみたんですが、Raspberry Piで撮るとやけに暗いし色もおかしい。UDOOだとそれなりにきれいに撮れるのに。uvccapture -vで調べてみた結果、BrightnessContrastSaturationGainの設定がおかしくなっていた。uvccaptureのソースを読んでみると、コマンドラインから前記のパラメータが指定されていない場合、v4l2ドライバへのioctlコールでパラメータリセットがかかる。そうなると、これがRPi固有の問題か、他のカーネルでも同じかわかんないけど、おかしな設定になってしまう。あとuvccaptureのソースを読んだついでに書いておくと、前記パラメータに0を指定すると無視されてリセットがかかり、やはりおかしな初期値が使われる。これはさすがにバグだと思う。

さて、UDOOを参考に
  • Brightness: 128
  • Contrast: 128
  • Saturation: 128
  • Gain: 1
で、RPiでもそれなりに素敵に撮れるようにできた。

でもまだ問題が残る。フォーカスである。

カメラの前に被写体として瓶を置いて撮ってみるものの、ピントが合ってない。さてどうしたものかと思っていろいろいじっていると、v4l2-ctlでフォーカスの設定ができそうなことに気づく。
$ v4l2-ctl --list-ctrls
...
                 focus_absolute (int)    : min=0 max=250 step=5 default=8189 value=0 flags=inactive
                     focus_auto (bool)   : default=1 value=1
...
これが使えるとしたら、UVCもなかなか気が利く。

まずはオートフォーカスをオフに。
$ v4l2-ctl --set-ctrl focus_auto=0
次にfocus_absoluteという値をいじってみる。今の設定値は
$ v4l2-ctl --get-ctrl focus_absolute
focus_absolute: 0
なので、ここから少しずつ刻みながら画像を確認してみる。
$ v4l2-ctl --set-ctrl focus_absolute=0
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus00.jpg
$ v4l2-ctl --set-ctrl focus_absolute=10
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus10.jpg
$ v4l2-ctl --set-ctrl focus_absolute=20
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus20.jpg
$ v4l2-ctl --set-ctrl focus_absolute=30
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus30.jpg
$ v4l2-ctl --set-ctrl focus_absolute=40
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus40.jpg
$ v4l2-ctl --set-ctrl focus_absolute=50
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus50.jpg
$ v4l2-ctl --set-ctrl focus_absolute=60
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus60.jpg
で、結果が下の画像。なおカメラから被写体までの距離は、チポトレソースが約10cm、シナモンシュガーが約20cm、ボトルのビールが約30cmです。(ちなみにこれらはアメリカのトレーダージョーで買い漁ってきた物。)

focus_absolute=0
focus_absolute=10
focus_absolute=20
focus_absolute=30
focus_absolute=40
focus_absolute=50
focus_absolute=60
撮影風景↓

まずfocus_absoluteに関してわかるのは、値が小さいほど無限遠側、大きいほどマクロ側のフォーカスとなること。それから10~30cm程度の近距離の被写体をうまく収める設定値はなさそう。10~40あたりの範囲で好みを調整するといいかもしれない。

オートフォーカスのときにどういう測距点を使っているのかわかりませんが、ちゃんと撮りたければマニュアルで設定してあげるほうがよさそうです。

2014年5月13日火曜日

ホワイトバランス設定してウェブカメラ録画

Linuxのコマンドラインでウェブカメラを使った動画撮影をする方法を昨日書いたんですが、若干ホワイトバランスが要調整という感じだった。ので、ホワイトバランス設定してから撮影する方法。

v4l2-ctlというツールを使います。インストールされていなければ
$ sudo apt-get install v4l-utils
でパッケージをインストール。

で、まずホワイトバランスを含め設定可能なパラメータの一覧を表示。
$ v4l2-ctl --list-ctrls
                     brightness (int)    : min=-64 max=64 step=1 default=0 value=0
                       contrast (int)    : min=0 max=64 step=1 default=32 value=32
                     saturation (int)    : min=0 max=128 step=1 default=67 value=67
                            hue (int)    : min=-40 max=40 step=1 default=0 value=0
 white_balance_temperature_auto (bool)   : default=1 value=1
                          gamma (int)    : min=72 max=150 step=1 default=110 value=110
                           gain (int)    : min=0 max=80 step=1 default=0 value=0
           power_line_frequency (menu)   : min=0 max=2 default=2 value=2
      white_balance_temperature (int)    : min=2800 max=6500 step=1 default=4600 value=4600 flags=inactive
                      sharpness (int)    : min=0 max=6 step=1 default=3 value=3
         backlight_compensation (int)    : min=0 max=2 step=1 default=1 value=1

現在の設定値の取得は
$ v4l2-ctl --get-ctrl white_balance_temperature
white_balance_temperature: 4600
オートホワイトバランスのON/OFF確認なら
$ v4l2-ctl --get-ctrl white_balance_temperature_auto
white_balance_temperature_auto: 1
でできる。

実際にホワイトバランスを設定してみる。オートホワイトバランスを切る必要があるので、white_balance_temperature_auto=0を入れる。で、色温度最低は
$ v4l2-ctl --set-ctrl=white_balance_temperature_auto=0,white_balance_temperature=2800
色温度最高なら
$ v4l2-ctl --set-ctrl=white_balance_temperature_auto=0,white_balance_temperature=6500
で設定できる。

あとは昨日書いた下記のコマンドで撮影してみると、違いがわかります。
$ streamer -c /dev/video0 -o test.avi -t 0:10 -s 320x240 -f rgb24

参考

Webcam settings on Ubuntu and Fedora Linux CLI from terminal - TechyTalk.info