Grabber::prepareLive Method

イメージストリームの構築を行います。デバイスをディスプレイやシンクと結び付け、フレームフィルタやオーバーレイの挿入を行います。

構文

bool prepareLive( bool bUseVideoRenderer );
パラメータ 説明
bUseVideoRenderer イメージストリームを開始する際にライブ表示を行うかどうかを指定します。

戻り値

処理が正常に完了した場合にはtrueを返します。もしエラーが発生した場合にはgetLastErrorクラスライブラリリファレンス>クラス>Grabber>Grabber::getLastError Methodをコールしてエラー情報の詳細を取得してください。

備考

このメソッドは指定した全オブジェクト(フレームフィルタ、オーバーレイ、シンク)をイメージストリーム上に挿入できるかどうかをチェックします。prepared状態の時、デバイスは帯域を割り当てることはしませんがイメージストリームのセットアップは完了します。よってstartLiveクラスライブラリリファレンス>クラス>Grabber>Grabber::startLive Methodをコールした際、イメージストリームの停止中に同じ処理が行われる場合と比較して格段に時間が短くなります。これによって複数のイメージストリームを複数のデバイス用にセットアップし(それぞれに一つのGrabberオブジェクトを使用) 、suspendLiveクラスライブラリリファレンス>クラス>Grabber>Grabber::suspendLive Methodをコールすることでliveからprepared、そしてまたliveと状態を変化させることでデバイスの切り替えを素早く行うことができるようになります。

prepareLiveのコール後はビデオストリームのサイズ変更を伴ういかなる処理も行うことはできません。以下の処理がそれに該当します。

stopLiveクラスライブラリリファレンス>クラス>Grabber>Grabber::stopLive MethodcloseDevクラスライブラリリファレンス>クラス>Grabber>Grabber::closeDev Methodへのコールはprepared状態を終了させます。

インフォメーション

IC Imaging Control 3.0より導入。

サンプル

以下のコードはprepareLivesuspendLiveを使って同一のバスに接続された2台の高解像度カメラからのイメージを"同時に"取り込む方法を紹介しています。

// 2台の高解像度カメラを同じFireWireバスに接続し
// 両方のカメラをUYVY 1024x768, 15fpsに設定するとした場合、
// 1台のカメラで利用可能な帯域の77%を占めることになるため
// 同じ解像度とフレームレートで動作させることは不可能となる

// カメラ1をオープンにする
Grabber grabber1;
grabber1.openDev( "DFx 31AF03" );
grabber1.setVideoFormat( "UYVY (1024x768)" );
grabber1.setFPS( 15.0 );

// カメラ2をオープンにする
Grabber grabber2;
grabber2.openDev( "DFx 31BF03" );
grabber2.setVideoFormat( "UYVY (1024x768)" );
grabber2.setFPS( 15.0 );

// シンクタイプの設定
// FrameHandlerSinkはRGB24画像のMemBufferCollection10バッファを含む
tFrameHandlerSinkPtr pSink1 = FrameHandlerSink::create( eRGB24, 10 );
grabber1.setSinkType( pSink1 );
tFrameHandlerSinkPtr pSink2 = FrameHandlerSink::create( eRGB24, 10 );
grabber2.setSinkType( pSink2 );

// デバイスを'prepared'の状態にする
// ほぼ全ての初期が完了するとstartLive() の処理は早くなる
if( !grabber1.prepareLive( false ) )
{
  std::cerr << "grabber1.prepareLive failed: " << grabber1.getLastError() << std::endl;
  return;
}
if( !grabber2.prepareLive( false ) )
{
  std::cerr << "grabber2.prepareLive failed: " << grabber2.getLastError() << std::endl;
  return;
}

DWORD start = ::GetTickCount();

for( int i = 0; i < 10; ++i )
{
  // カメラ1から1枚の画像を取り込む
  grabber1.startLive( false );
  pSink1->snapImages( 1 );
  grabber1.suspendLive();

  // カメラ2から1枚の画像を取り込む
  grabber2.startLive( false );
  pSink2->snapImages( 1 );
  grabber2.suspendLive();
}

DWORD stop = ::GetTickCount();
std::cout << "2x10 images snapped in " << (stop-start) << "ms" << std::endl;

// 両方のカメラを止める
grabber1.stopLive();
grabber2.stopLive();

// 取り込んだ画像を保存する
pSink1->getMemBufferCollection()->save( "cam1-*.bmp" );

prepareLiveの他の使用例についてはGrabber::getVideoDataDimensionクラスライブラリリファレンス>クラス>VideoFormatItem>Grabber::getVideoDataDimension Methodを参照ください。