mengineer's blog

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

JAISDK はじめの一歩

今更ですが基本に戻ってみよう、ということで、JAISDKの使い方を見てみます、
最新バージョンは3.01ですね、下記に情報載せてます mengineer.hatenablog.com

インストールすると、sampleフォルダ内にJAISDKのサンプルが有ります、
CPPがVisualC++、NETがVisualC#、いずれもVisualStudio2005形式です。

今回はNETの方を見てみます、フォルダ内には24種類のサンプルが有ります、
ちなみにCPPでは35種類、サンプルが豊富なのもJAISDKの特徴です。

f:id:mengineer:20170722114030p:plain

基本中の基本(ということで、はじめの一歩)SimpleImageDisplaySampleで
JAISDKの使い方を見てみましょう。

基本的な流れ

NETフォルダ内のサンプルはJAISDK.NETというWrapperを使っています、
docフォルダ内にJAI SDK .NETのマニュアルも有りますので、参照して下さい。

以下、SimpleImageDisplaySampleのソースを元に流れを追っていきます。

1. Jai_FactoryDotNET.dllへの参照追加

binフォルダ内に有ります、VisualStudioの参照設定→参照の追加、で選択、
SimpleImageDisplaySampleでは、当然追加済みになっています。

f:id:mengineer:20170722115842p:plain

もちろんusingにも追加します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Jai_FactoryDotNET;
2. CFactory、CCamera、CNodeの定義

CFactoryはSDK全体のエントリーポイントです、CCameraは接続されたカメラ。

CNodeはGenICamのNode名で、このサンプルではWidth、Height、Gainの3つを
定義していますが、他にも必要なものが有れば定義しておきます。

namespace SimpleImageDisplaySample
{
    public partial class Form1 : Form
    {
        // Main factory object
        CFactory myFactory = new CFactory();

        // Opened camera object
        CCamera myCamera;

        // GenICam nodes
        CNode myWidthNode;
        CNode myHeightNode;
        CNode myGainNode;
3. CFactoyオープンとカメラ検索

myFactory.OpenでFactoryをOpenします、その後で接続されたカメラを検索します、
このサンプルでは、SerchButtonクリック時に検索するようになっています。

public Form1()
{
    InitializeComponent();

    Jai_FactoryWrapper.EFactoryError error = Jai_FactoryWrapper.EFactoryError.Success;

    // Open the factory with the default Registry database
    error = myFactory.Open("");

    // Search for cameras and update all controls
    SearchButton_Click(null, null);
}
4. カメラリスト更新 → カメラオープン

以下はSearchButton_Click以降、カメラ検索の実際の処理を追っていきます、
最初の部分は、既にOpen済みのカメラが有れば一旦閉じているだけです。

myFactory.UpdateCameraListで、接続されたカメラを検出してくれます、
見つかったカメラの台数がmyFactory.CameraList.Countに戻ってきます。

リストの順番にOpenしていきますが、もしカメラが複数台有る場合は
先頭のカメラがOpen出来た時点でbreakします。

private void SearchButton_Click(object sender, EventArgs e)
{
    if (null != myCamera)
    {
        if (myCamera.IsOpen)
        {
            myCamera.Close();
        }

        myCamera = null;
    }

    // Discover GigE and/or generic GenTL devices using myFactory.UpdateCameraList(in this case specifying Filter Driver for GigE cameras).
    myFactory.UpdateCameraList(Jai_FactoryDotNET.CFactory.EDriverType.FilterDriver);

    // Open the camera - first check for GigE devices
    for (int i = 0; i < myFactory.CameraList.Count; i++)
    {
        myCamera = myFactory.CameraList[i];
        if (Jai_FactoryWrapper.EFactoryError.Success == myCamera.Open())
        {
            break;
        }
    }  
5. 所望の処理を実施

無事にカメラがOpen出来れば、それに対して所望の処理を実施します。

このサンプルでは各Node値を取得、startボタンを押すと別ウィンドウに画像表示
stopボタンで表示終了という処理が入っています、以下がサンプル画面です。

f:id:mengineer:20170722130655p:plain

右上の…と書かれた小さいボタンがSearchButtonです、Width,Height,Gainは
カメラのNode値です、Nodeの読み書きについては別記事で分けて見てみます。

6. カメラクローズ

サンプル終了時、myCamera.Close()でカメラをクローズしています。
(Factoryは閉じなくても大丈夫なのかな?、ちょっと謎)

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (myCamera != null)
    {
        StopButton_Click(null, null);
        myCamera.Close();
    }
}

ということで、FactoryOpen → CameraOpen → 所望の処理 → CameraClose
というのが、おおまかな処理の流れになります、今回はここまで!