画像の取得
この記事では、ビデオキャプチャデバイスからデータストリームを設定し、1枚の画像を取得する方法を詳しく説明します。
ビデオキャプチャデバイスのオープンと設定
まず、ライブラリを初期化し、利用可能な最初のビデオキャプチャデバイスをオープンします。
// Initialize the library
ic4.Library.Init();
// Create a grabber object
var grabber = new ic4.Grabber();
// Open the first available video capture device
var firstDevInfo = ic4.DeviceEnum.Devices.First();
grabber.DeviceOpen(firstDevInfo);
Console.WriteLine($"Opened device {grabber.DeviceInfo.ModelName}");
次に、デバイスを設定する必要があります。この手順は重要で、多くの場合、プログラムは動作を開始する前にカメラが既知の状態に設定されていることを前提とします。 この例では、デバイスのWidth および Height プロパティを使用して解像度を設定しています。
// Set the resolution to 640x480
grabber.DevicePropertyMap.SetValue(ic4.PropId.Width, 640);
grabber.DevicePropertyMap.SetValue(ic4.PropId.Height, 480);
この時点で、アプリケーションはあらかじめ用意されたデバイス設定ファイルをGrabber.DeviceOpenFromStateを使って読み込んだり、PropertyMap.DeSerializeを使用してシリアライズされたプロパティ設定を適用したりすることも可能です。
Sinkとデータストリームの設定
デバイスの設定が完了したら、次にデータストリームを設定します。ビデオキャプチャデバイスから画像データを受信するには、Sink オブジェクトを作成する必要があります。SnapSink は、必要に応じて画像を取得する用途に最適なSinkです。
// Create a SnapSink. A SnapSink allows grabbing single images (or image sequences) out of a data stream.
var sink = new ic4.SnapSink();
// Setup data stream from the video capture device to the sink and start image acquisition.
grabber.StreamSetup(sink, ic4.StreamSetupOption.AcquisitionStart);
Grabber.StreamSetup を呼び出し、引数としてSinkを渡すことでデータストリームが確立されます。また、setupOption パラメータに StreamSetupOption.AcquisitionStart を指定することで、データストリーム作成直後にデバイスが画像取得を開始するよう指示しています。
StreamSetup の呼び出しが正常に完了すると、デバイスはホストコンピュータへ継続的に画像を送信します。
画像の取得
SnapSink.SnapSingle を呼び出すことで、シンクは次の画像が到着するまで待機します。指定したタイムアウト時間内に画像を受信した場合、その画像が返されます。
try
{
// Grab a single image out of the data stream.
var image = sink.SnapSingle(TimeSpan.FromSeconds(1));
// Print image information.
Console.WriteLine($"Received an image. ImageType: {image.ImageType}");
// Save the image.
// Extension method syntax required using ic4; at the top of this file.
image.SaveAsBitmap("test.bmp");
}
catch(ic4.IC4Exception ex)
{
Console.WriteLine(ex.Message);
}
この例では、受信した画像の情報を表示し、ビットマップファイルとして保存しています。
SnapSink.SnapSingle および SaveAsBitmap は、いずれも失敗する可能性があります。そのため、エラー発生時にエラーメッセージを出力できるよう、コードを try..catch ブロックで囲んでいます。
データストリームの停止
Grabber.StreamStop を呼び出すことで、データストリームを停止します。
// Stop the data stream.
grabber.StreamStop();
画像取得およびデータストリームを停止することは重要です。取得を継続したままにすると、CPU やメモリリソース、さらには通信媒体の帯域幅を無駄に消費してしまいます。


