libdc1394
目次
概要
IEEE1394カメラを扱うためのライブラリ。Linux カーネル同梱の video1394 ドライバを使用して、 IEEE1394 バスの設定やカメラの探索および設定、画像の取得まで面倒見てくれる。バスに接続された複数のカメラから同時に画像を取得することもできる。 カメラのパラメタ調整やコントロールについては、IIDC 規格で定められていることは大体できるようだ。
IIDC のライブラリはしばらくの間いくつかの実装が公開されていたが、現在では libdc1394 が代表的なものとして認知されており、 ほとんどの IIDC 対応アプリケーションがこれを利用している。
付属ユーティリティ
libdc1394 のパッケージには examples/ 以下に有用なユーティリティが付属している。dc1394_vloopback は、vloopback を使って IEEE1394 のカメラからの画像を video4linux 用のアプリケーションから使えるようにするものである。これにより、IIDC に対応していないビデオアプリケーションも使えるようになる。 dc1394_multiview は、複数台の IEEE1394 カメラからの画像を一度に表示できるもの。カメラチェックに使える。
libdc1394 プログラミング
libdc1394 を使ったプログラムは若干複雑である。これは IEEE1394 バスにカメラが複数台接続される場合があることを考慮してのことで、 デバイスファイルさえ決定すれば後はただ一つのビデオソースだけ処理すればよい video4linux とは異なる。
画像を取得する方法はあるが、DMA 転送を利用してリアルタイムに画像を取得し続ける場合には、そのおおまかな手順は、
- IEEE1394 ポートの取得
- カメラの探索
- カメラの初期化
- 画像送受信の設定
- 画像送受信の開始
- 画像の取得・解放
となる。
以降、libdc1394 にバンドルされている、dc1394_multiview.c をベースに解説する。
IEEE1394 ポートの取得
raw1394_get_port_info(raw_handle, ports, numPorts)
を使って、使用できる IEEE1394 ポートの情報を取得する。
この関数の返り値が使用できるポートの数となり、ports には各 IEEE1394 ポートの情報が格納される。
カメラの探索
次に、取得した各ポートに接続されているカメラを探す。ここから、libdc1394 の提供する関数群を使い始める。
まず各ポートに対応したハンドラを、dc1394_create_handle()
で作成する。
このハンドラを引数に関数 dc1394_get_camera_nodes()
を呼ぶと、
ポートに接続されているカメラを見付けることができる。カメラが見付からない場合には、次のポートを探索する。
関数は、接続されているカメラのノード番号のリスト (nodeit_t *camera_nodes
) を返すので、
各ノードを順番に調べていく。このとき、dc1394_get_camera_info(), dc1394_print_camera_info()
を使うと、
各カメラの情報をコンソールに表示させることができるので参考になる。
カメラの初期化
前節の手順でカメラが見付かったら、そのカメラを初期化する。といってもあまりすることはなく、
dc1394_get_camera_feature_set()
でカメラの設定項目と現在の設定値を取得するだけ。
必要なければこの手順は飛ばしてもよい。
画像送受信の設定
カメラからの画像送信の設定と、ホスト側での受信の設定をする。設定は
dc1394_dma_setup_capture()
で行う。現在の設定は dc1394_get_iso_channel_and_speed()
で取得できる。
ここで設定するのは
- 解像度
- ピクセルフォーマット
- 転送速度
- 秒当たり撮影枚数 (fps)
- 転送用バッファ数
など。
このとき、これらの情報が dc1394_cameracapture
型の変数に格納される。(dc1394_multiview では cameras
)
画像送受信の開始
dc1394_start_iso_transmission()
を呼ぶと実際に転送が開始される。
画像の取得・解放
転送が開始されると画像はカメラからどんどん送られてくる。送られてきた画像はバッファに蓄積されているので、それを読み出す。
まず dc1394_dma_single_capture()
で画像の転送が完了するのを待つ(カメラを複数台使う場合は、dc1394_dma_multi_capture()
)。すると cameras.capture_buffer にバッファの先頭アドレスが格納されるので、
そこから画像データを読み出せばよい。
バッファからデータを読み出し終わったら、dc1394_dma_done_with_buffer()
を呼ぶ。こうすることでそのバッファが再使用されるようになる。
IEEE1394b の場合
IEEE1394b (FireWire 800) 用のカメラを使う場合は、
dc1394_set_operation_mode(handler, node, OPERATION_MODE_1394B)
というように、1394b の使用を設定しておき、
dc1394_dma_setup_capture()
を呼ぶときに SPEED_400
の代わりに SPEED_800
を引数に与え、800Mbps での転送を指示しておく。
関連
- libdc1394-2 - 現在進行中の API 第2版。
- Coriander - libdc1394 を使った IIDC カメラユーティリティ。
- unicap