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

2014年5月20日火曜日

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

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

さっそくボードにつないで実験してみるわけですが、ARMボードでの使用となれば、早々簡単にはいかない。uvccaptureで静止画撮影してみたんですが、Raspberry Piで撮るとやけに暗いし色もおかしい。UDOOだとそれなりにきれいに撮れるのに。uvccapture -vで調べてみた結果、Brightness、Contrast、Saturation、Gainの設定がおかしくなっていた。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あたりの範囲で好みを調整するといいかもしれない。

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

2013年11月29日金曜日

Raspberry PiにWebカメラを繋げて動画撮影してみたが


すっかり秋も深まり、毎日寒くなってきました。Raspberry Piにカメラを繋げていろいろ面白いことしたくなる季節です。

Raspberry Piのカメラといえば、Camera Boardが定番です。 OmniVisionの5MP裏面照射型CMOSセンサを積んでいて、FullHD 30fpsの動画撮影にも対応、MIPIインタフェースでRPiと接続するモジュールです。ボード上の専用コネクタにフレキで繋ぐようになっています。

それから最近、赤外線イメージセンサ搭載のPiNoirというカメラモジュールも発売されたみたいですね。夜目の利くRPiも楽しそう。

でも今のところ私はRPi用のカメラモジュールを持っていません。そこで、家に転がっていたUSB接続のWebカメラを繋いでちょっと遊んでみます。

使用したのは、バッファローさんのBSW32KM01H。UVC対応なのでLinuxでもばっちりです。早速繋いでみる。dmesgとlsusbはこんな感じ。
自動的にuvcvideoドライバがロードされ、/dev/video0が追加されているはずです。では、ビデオ録画を試してみます。まずffmpegをインストールします。
ffmpegコマンドを使ってカメラ録画しファイルに書き出します。 なんとなく、flvだとうまくいったのでとりあえず。

それで、録画したファイルをWinSCPとかでWindowsに持ってきてプレーヤーで再生してみるわけですが。。数秒は撮影したはずなのに、一瞬で再生が終わってしまう!
何故?もう一度撮り直してみると、、、
1fpsしか出てない!

うーん、何だろう。。エンコードが重い?topでCPU使用率見ても、だいたい10~30%くらいなんだけどなぁ。
まぁ気が向いたら追い追い見てみますか。

カメラ繋いだついでに静止画撮影もしてみましょう。まずuvccaptureをインストール。
で、とりあえず撮影。
これでカレントディレクトリにsnap.jpgができます。見てみるとちょっとホワイトバランスがおかしいんですが、その辺は調整できるようです。一応、撮影はできました。


カメラモジュール買うかなぁ。


参考情報
How to stream from the linux (ubuntu :) command line to UStream - KnowledgeVoid
How to capture a webcam input - FFmpeg
uvccaptureで画像取得 - ともの技術メモ