Quelles sont les différences concernant la programmation entre mvBlueFOX et mvBlueFOX3?

Pour touts les produits MATRIX VISION, il existe une interface pilote unifiée appelée mvIMPACT Acquire. La seule différence entre

est l'aspect de l'interface (Interface Layout).

Pour le mvBlueFOX, il existe l'interface MATRIX VISION spécifique "DeviceSpecific".
Contrairement aux caméras mvBlueFOX3 qui sont baséees sur le standard de traitement d'images USB3 Vision et "GenICam".

USB3 Vision contrôle la communication via USB 3.0 entre l'organe d'acquisition d'images et l'application.

Le standard GenICam, quant à lui, unifie l'accès aus paramètres de l'organe en question. De plus, ce standard "nomme" les paramètres et les valeurs via le "Standard Feature Naming Convention". Vous trouverez la version actulle du SFNC sur le site web de l'EMVA: SFNC sur EMVA.

Pour le programmeur, que cela implique-t-il pour adapter un "vieux" code d'application quand on change de caméra ?

Basiquement, vous pouvez utiliser le code mvIMPACT Acquire dans une large mesure. Par exemple, la partie ou vous:

  • addressez et ouvrez la caméra
  • acquiérez les images

reste la même. Ce sont toutes des classes et fonctions common , qui sont disponibles sous toutes les inferfaces.

La seule chose qui change, est la façon dont vous récupérez ou positionnez les paramètres de la caméra.

Ceci inclue également les programmes HRTC. Dans GenICam vous pouvez réaliser un programme HRTC en utilisant des Compteurs et desTimers. L'exemple ci-dessous montre comment vous pouvez paramétrer l'exposition à 1000 us via DeviceSpecific Interface Layout:

#include <iostream>
#include <mvIMPACT_CPP/mvIMPACT_acquire.h>
 
using namespace std;
using namespace mvIMPACT::acquire;

//-----------------------------------------------------------------------------
int main( int /*argc*/, char* /*argv*/[] )
//-----------------------------------------------------------------------------
{
  DeviceManager devMgr;
  Device* pDev = devMgr.getDeviceByFamily("mvBlueFOX");
  if (pDev == 0)
  {
	  cout << "There is currently no mvBlueFOX2 device connected," << endl;
	  cout << "or the mvBlueFOX2 drivers have not been" << endl;
	  cout << "correctly installed." << endl;
          cout << "Skipping mvBlueFOX2 single image capture..." << endl;
	  return 1;
  }
  cout << "Using Device: " << pDev->product.readS() << endl;
  cout << "Serial: " << pDev->serial.readS() << endl << endl ;
  pDev->interfaceLayout.write(dilDeviceSpecific);
  pDev->open();

  // -----------------DeviceSpecific part with property adjusting-----------
  CameraSettingsBlueFOX cs( pDev );
  cs.expose_us.write(10000);
  // --------------------------DeviceSpecific part END----------------------

  FunctionInterface fi( pDev );
  fi.imageRequestSingle();
  const int iMaxWaitTime_ms = -1;
  int requestNr = fi.imageRequestWaitFor( iMaxWaitTime_ms );
  const Request* pRequest = fi.getRequest( requestNr );
  cout << "Image captured( " << pRequest->imagePixelFormat.readS() 
       << " " << pRequest->imageWidth.read() 
       << "x" << pRequest->imageHeight.read() 
       << " )" << endl;
  fi.imageRequestUnlock( requestNr );
}

Pour utiliser ce code avec mvBlueFOX3, vous pouvez porter la partie paramétrage en utilisant le GenICam Interface Layout. Les lignes rouges peuvent être réutilisées :

#include <iostream>
#include <mvIMPACT_CPP/mvIMPACT_acquire.h>
#include <mvIMPACT_CPP\mvIMPACT_acquire_GenICam.h>
 
using namespace std;
using namespace mvIMPACT::acquire;
using namespace mvIMPACT::acquire::GenICam;

//-----------------------------------------------------------------------------
int main( int /*argc*/, char* /*argv*/[] )
//-----------------------------------------------------------------------------
{
  DeviceManager devMgr;
  Device* pDev = devMgr.getDeviceByFamily("mvBlueFOX3");
  if (pDev == 0)
  {
	  cout << "There is currently no mvBlueFOX3 device connected," << endl;
	  cout << "or the mvBlueFOX3 drivers have not been" << endl;
	  cout << "correctly installed." << endl;
          cout << "Skipping mvBlueFOX3 single image capture..." << endl;
	  return 1;
  }
  cout << "Using Device: " << pDev->product.readS() << endl;
  cout << "Serial: " << pDev->serial.readS() << endl << endl ;
  // Note the different InterfaceLayout selection
  pDev->interfaceLayout.write(dilGenICam);
  pDev->open();

  // -----------------------GenICam part with property adjusting-------------
  // Note the different class name. This is a GenICam Class.
  AcquisitionControl ac(pDev);
  ac.exposureTime.write(10000);
  // ------------------------------GenICam part END--------------------------

  FunctionInterface fi( pDev );
  fi.imageRequestSingle();
  const int iMaxWaitTime_ms = -1;
  int requestNr = fi.imageRequestWaitFor( iMaxWaitTime_ms );
  const Request* pRequest = fi.getRequest( requestNr );
  cout << "Image captured( " << pRequest->imagePixelFormat.readS() 
       << " " << pRequest->imageWidth.read() 
       << "x" << pRequest->imageHeight.read() 
       << " )" << endl;
  fi.imageRequestUnlock( requestNr );
}

Le code est simplifié. Par exemple, il est seulement autorisé la connexion d'une caméra de la "bonne" famille. Sinon, le programme ne connait pas quelle caméra il devrait utiliser. Des exemples de programmes plus détaillés peuvent être trouvés dans le Manuel API pour C, pour C++, pour .NET.

Utiliser l'interface GenICam offre d'autres avantages :

Vous pouvez utiliser le même code de programmation avec d'autres produits respectant la norme USB3 Vision / GigE Vision / GenICam! C'est bien la raison pour laquelle il existe un pilote unifié mvGenTL_Acquire pour tous ces produits.

Ceux-ci ne sont pas nécessairement des caméras MATRIX VISION. These may not necessarily be MATRIX VISION cameras. Si vous changez, par exemple, la ligne suivante dans le code ci-dessus, de :

Device* pDev = devMgr.getDeviceByFamily("mvBlueFOX3");

en :

Device* pDev = devMgr.getDeviceByFamily("GigEVision");

vous pouvez alors utiliser une caméra compatible GigE Vision comme par exemple mvBlueCOUGAR-X avec le même code.

Vous constatez donc que vous pouvez tirer avantage des "normes" de traitement d'images. Vous avez libre choix et vous n'êtes désormais plus attaché à un fournisseur particulier. You have a free choice and you are not tied to any manufacturer anymore. Privilégiez donc aujourd'hui le choix de ces "normes" quand vous achetez des composants de Traitement d'Images.

Retour