mengineer's blog

ニッチなネタばかりですが。

eBUS SDK 使ってみる その1 カメラ検出

引き続き eBUS SDKネタです。

まずは接続されているカメラを、 いかに検出するかというお話、
下記サンプルプログラムやヘルプファイルで調べた内容になります。

f:id:mengineer:20190225140600p:plain

何はともあれ、まずは”PvDotNet"と"PvGUIDotNet"への参照を追加します。

using PvDotNet;
using PvGUIDotNet;

インターフェイスの取得

下記3つを定義します、いずれも先ほどのpVDotNetのメンバーです、

private PvSystem mSys = new PvSystem();
private PvDevice mDevice = null;
private PvStream mStream = null;

mSys.InterfaceCountで、そのPC内で有効なインターフェイス
(USB3のコントローラーやGigEのNICなど)を取得出来ます。

カメラ選択

pvGUIDotNetのメンバーに、PvDeviceFinderFormというのが有り、
それを使うだけで、 ダイアログ表示&カメラ選択出来ます、お手軽。

例えばbutton1クリックに割り当てるとこんなイメージ。

ShowDialog()でダイアログを表示、そこで選択されたカメラの情報を、
lDeviceInfo(PvDotNetのPvDeveiceInfo)に取り出します。

更にlDeviceInfoから、mDeviceとmStreamをCreateしていきます。

private void button1_Click(object sender, EventArgs e)
{
    using (PvDeviceFinderForm lForm = new PvDeviceFinderForm())
    {
        if ((lForm.ShowDialog() == DialogResult.OK) && (lForm.Selected != null))
        {
            try
            {
                // Get DeviceInfo, Show DisplayID
                PvDeviceInfo lDeviceInfo = lForm.Selected as PvDeviceInfo;
                label2.Text += lDeviceInfo.DisplayID;

                // Create and connect device.
                mDevice = PvDevice.CreateAndConnect(lDeviceInfo);

                // Create and Open stream.
                mStream = PvStream.CreateAndOpen(lDeviceInfo);
            }
            catch (PvException ex)
            {
                MessageBox.Show(ex.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            // Enable Start Button
            button2.Enabled = true;
        }
    }
}

実際のPvDeviceFinderFormは、こんな画面です。
(昨日のeBUS Playerと同じですね、当たり前ですけど)

f:id:mengineer:20190225150915p:plain

画面左側に3つインターフェイスが出てきますので、
先ほどのインターフェイス数は、このPCの場合”3”となります。

事前にインターフェイス数を調べておいて、1以上の場合のみ、
カメラ選択へ進む、なんてことも出来そうな感じです。

DeveiceInfoの中身

デバッガで見た情報です、機種名やシリアルNoなど参照出来ます、
また”Type"でUSB3かGigEかなども判別出来るようです。

f:id:mengineer:20190225153620p:plain

実際はダイアログでカメラ選択するより、起動したら自動検出するとか、
シリアルNoが”XXXX”のカメラから開いていく、等が多いはずなので、
次はダイアログを使わないで検出する手順へ

カメラ自動検出

先ほどのbutton1クリックを、下記のように変更します。

mSys.Find()で、ダイアログを表示させた時と同様に、
インターフェイス毎に接続カメラが有るか探してくれるようです。

カメラが有れば(lInterface.DeviceCountが0より大きければ)
その情報をlDeviceInfoに入れます。

あとはlDeviceInfoがnullで無いことを確認したうえで、
先ほどと同様、mDeviceとmStreamをCreateしていきます。

lDeviceInfoの機種名やシリアルNoなどと照合させることで、
複数台から任意のカメラを検出することも出来そうです。

PvDeviceInfo lDeviceInfo = null;
PvInterface lInterface = null;

// Find All I/F, Camera
mSys.Find();

// Serch each Interface
for (UInt32 i = 0; i < mSys.InterfaceCount; i++)
{
    lInterface = mSys.GetInterface(i);
    UInt32 lDeviceCount = lInterface.DeviceCount;

    // Serch Camera in each Interface
    if (lInterface.DeviceCount > 0)
    {
        for (UInt32 j = 0; j < lInterface.DeviceCount; j++)
        {
            lDeviceInfo = lInterface.GetDeviceInfo(j);
        }
    }
}