Qt(C++)プロジェクトでBasler工業カメラを使用(2パラメータ設定)


Qt(C++)プロジェクトでBasler工業カメラを使用(2パラメータ設定)
前のブログではpylonの基本構造とシステム内のカメラを列挙する方法について説明しました.この記事では、カメラの各パラメータを設定する方法について説明します.
カメラパラメータを設定する前に、カメラオブジェクトを取得します.Pylon::CTlFactoryには、カメラオブジェクトを生成し、IPylonDeviceへのポインタを返すCreateDevice()メソッドがあります.次のコードは、列挙された最初のカメラに対応するオブジェクトを取得するために使用されます.
    Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
    DeviceInfoList_t lstDevices;
    TlFactory.EnumerateDevices( lstDevices );
    IPylonDevice * pDevice;
    if(!lstDevices.empty())
    {
        pDevice = TlFactory.CreateDevice(lstDevices[0]);
    }

上記のコードは、以下のように簡略化することもできます.
    Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
    IPylonDevice * pDevice = TlFactory.CreateFirstDevice();

上のCreateFirstDevice関数は、列挙された最初のカメラを生成するためのインタフェースです.転送層はGigE、USBなど多くの中に分けられていることを知っています.GigEインタフェースの最初のカメラインタフェースを直接生成したい場合は、GigE転送層のインタフェースを取得してから、インタフェースのCreateFirstDevice関数を呼び出します.具体的には、次のコードクリップを参照してください.
    Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
    Pylon::IGigETransportLayer* pTl = static_cast<:igigetransportlayer> (TlFactory.CreateTl("BaslerGigE"));
    IPylonDevice * pDevice = pTl->CreateFirstDevice();

前回ブログで紹介したカメラのパラメータはGenApi Node Mapsデータ構造で表現されています.このNode MapsのインタフェースタイプはGenApi::INodeMapであり,IPylonDeviceのGetTLNodeMap()関数とGetNodeMap()関数で得ることができる.GetTLNodeMap()は、伝送層パラメータを得るために使用され、GetNodeMap()はカメラ自体のパラメータに対応する.コードの例を次に示します.
    Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
    IPylonDevice * pDevice = TlFactory.CreateFirstDevice();
    GenApi::INodeMap* NodeMap = pDevice->GetNodeMap();
    GenApi::INodeMap* TLNodeMap = pDevice->GetTLNodeMap();

では、カメラにはどのようなパラメータがありますか.これらのパラメータの名前は何ですか.これはGenICam Standard Feature Naming Convention(SFNC)を参照する必要があります.BaslerのUSB 3のカメラはSFNC 2.0規格を遵守し、GigEとFirewireカメラは1.xバージョンのSFNC.
SFNC 2.0およびSFNC 1.xにはまだ多くの違いがあります.例えばカメラのゲインは、SFNC 2.0規格では浮動小数点型パラメータであり、名前は「Gain」であり、1.xは整数型パラメータで、名前は「GainRaw」です.
次に例を挙げると、「Gain」というパラメータの範囲を取得し、このパラメータの値を最大最小値の平均値に設定します.コードはこう書くことができます
    Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
    IPylonDevice * pDevice = TlFactory.CreateFirstDevice();
    GenApi::INodeMap* NodeMap = pDevice->GetNodeMap();
    GenApi::INode *pNode = pNodeMap->GetNode("Gain");
    GenApi::CFloatPtr gain(pNode);
    float gainMin = gain->GetMin();
    float gainMax = gain->GetMax();
    qDebug() << "current gain = " << gain->GetValue();
    gain->SetValue(gainMin + (gainMax - gainMin) / 2.0);

ここでは、まずカメラがGainというパラメータをサポートしていない場合、pNodeは空のポインタになります.後の操作は間違っています.第二に、Gainというパラメータは必ずしも読み書き可能ではなく、gain->GetMin()を読み出さないとエラーが発生します.書いてはいけない場合はgain->SetValue()が間違っています.
このINodeインタフェースが読み書き可能かどうかをテストするには、GenApi::IsReadable()とGenApi::IsWritable()を使用します.
  • また、カメラのパラメータは、カメラが開かれてから読み書きできることに特に注意する必要があります.

  • カメラがどの伝送層であるかを知っていれば、より簡単なアクセス方法もあります.例えば、私たちのカメラがGigEインタフェースであれば、pDeviceからCBaslerGigEinstantCameraオブジェクトを構築し、このオブジェクトを通じてカメラの各プロパティにアクセスすることができます.たとえば、次のコードがあります.
        Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
        Pylon::IGigETransportLayer* pTl = static_cast<:igigetransportlayer> (TlFactory.CreateTl("BaslerGigE"));
    
        IPylonDevice * pDevice = pTl->CreateFirstDevice();
        CBaslerGigEInstantCamera  camera(pDevice);
        camera.Open();
        qDebug() << GenApi::IsReadable(camera.GainRaw);
        qDebug() << "GainRaw = " << camera.GainRaw.GetValue();
        qDebug() << "GainRaw.GetMax() = " <<  camera.GainRaw.GetMax();
        qDebug() << GenApi::IsWritable(camera.GainRaw);
        camera.GainRaw = camera.GainRaw.GetMax();
        camera.GainRaw.SetValue(camera.GainRaw.GetMin());
        camera.Close();

    これでカメラパラメータの設定方法について説明します.カメラがサポートするパラメータについては、カメラの説明ドキュメントを参照してください.