mjpg_streamer でUVCカメラのピントを固定して利用

3Dプリンターのプリントを ラズベリーパイで制御させるため、OctoPrint を使ってます。

USB カメラを使ってストリーミング表示と保存をして、プリントの進捗確認や失敗時の原因確認に使っています。これの覚書。

ストリーミングはmjpg_streamer 利用。下記コマンドで実行。

mjpg_streamer -b -o "output_http.so -n" -i "input_uvc.so -f 1"

ただし、ピントがあわないのが悩みの種だった。プリントヘッドがあちこち動いてそのたびにAutofocusでピントが背景のほうにあってしまう。

mjpg_streamer の output_http.so ではサンプルでAutofocus無効にして手動focusが設定できる。サンプルは output_http.so のオプションとして -w でフォルダ指定して実行。

mjpg_streamer -i "input_uvc.so -f 1" -o "output_http.so -w /usr/local/share/mjpg-streamer/www/"
これ。streamで見ながら数字を変更すると、フォーカスが動くのが確認できる。

但し起動のたびにピント変更も面倒だし、セキュリティ上もサンプル出しておくのも微妙。

そもそもどうやっているのかとみていると、USBカメラの規格でUVCがあり、これは v4l2-ctl コマンドで制御できることが判明。

フォーカスを手動にして、手前に固定するコマンドをmjpg_streamer起動前に記載して解決。

#!/bin/sh
v4l2-ctl -d /dev/video0 -c focus_auto=0
v4l2-ctl -d /dev/video0 -c focus_absolute=29
mjpg_streamer -b -o "output_http.so -n" -i "input_uvc.so -f 1"

v4l2-ctl は mjpg_streamer インストール時に導入済みだが、単体はv4l-utils でインストールできる。

sudo apt-get install v4l-utils

USBカメラの対応コマンドは 下記で確認できる。

v4l2-ctl -d /dev/video0 --list-ctrls-menu

USBカメラの情報は下記。autofocus が無効になっているのが分かる。

v4l2-ctl -d /dev/video0 --all

Driver Info:
Driver name : uvcvideo
Card type : Microsoft LifeCam Studio(TM):
Bus info : usb-3f980000.usb-1.3.1
Driver version : 4.19.97
Capabilities : 0x84a00001
Video Capture
Metadata Capture
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x04200001
Video Capture
Streaming
Extended Pix Format
Media Driver Info:
Driver name : uvcvideo
Model : Microsoft LifeCam Studio(TM):
Serial :
Bus info : usb-3f980000.usb-1.3.1
Media version : 4.19.97
Hardware revision: 0x00000113 (275)
Driver version : 4.19.97
Interface Info:
ID : 0x03000002
Type : V4L Video
Entity Info:
ID : 0x00000001 (1)
Name : Microsoft LifeCam Studio(TM):
Function : V4L2 I/O
Flags : default
Pad 0x01000007 : 0: Sink
Link 0x02000013: from remote pad 0x100000a of entity 'Extension 5': Data, Enabled, Immutable
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
Width/Height : 640/480
Pixel Format : 'MJPG' (Motion-JPEG)
Field : None
Bytes per Line : 0
Size Image : 614400
Colorspace : sRGB
Transfer Function : Default (maps to sRGB)
YCbCr/HSV Encoding: Default (maps to ITU-R 601)
Quantization : Default (maps to Full Range)
Flags :
Crop Capability Video Capture:
Bounds : Left 0, Top 0, Width 640, Height 480
Default : Left 0, Top 0, Width 640, Height 480
Pixel Aspect: 1/1
Selection: crop_default, Left 0, Top 0, Width 640, Height 480, Flags:
Selection: crop_bounds, Left 0, Top 0, Width 640, Height 480, Flags:
Streaming Parameters Video Capture:
Capabilities : timeperframe
Frames per second: 7.500 (15/2)
Read buffers : 0
brightness 0x00980900 (int) : min=30 max=255 step=1 default=133 value=82
contrast 0x00980901 (int) : min=0 max=10 step=1 default=5 value=5
saturation 0x00980902 (int) : min=0 max=200 step=1 default=103 value=103
white_balance_temperature_auto 0x0098090c (bool) : default=1 value=1
power_line_frequency 0x00980918 (menu) : min=0 max=2 default=2 value=1
white_balance_temperature 0x0098091a (int) : min=2500 max=10000 step=1 default=4500 value=4898 flags=inactive
sharpness 0x0098091b (int) : min=0 max=50 step=1 default=25 value=25
backlight_compensation 0x0098091c (int) : min=0 max=10 step=1 default=0 value=0
exposure_auto 0x009a0901 (menu) : min=0 max=3 default=3 value=3
exposure_absolute 0x009a0902 (int) : min=1 max=10000 step=1 default=156 value=156 flags=inactive
pan_absolute 0x009a0908 (int) : min=-529200 max=529200 step=3600 default=0 value=0
tilt_absolute 0x009a0909 (int) : min=-432000 max=432000 step=3600 default=0 value=0
focus_absolute 0x009a090a (int) : min=0 max=40 step=1 default=0 value=29
focus_auto 0x009a090c (bool) : default=1 value=0
zoom_absolute 0x009a090d (int) : min=0 max=317 step=1 default=0 value=0

ラズパイでUSBカメラ使う時は、セルフパワータイプのUSBハブ利用の事。