Welche Unterschiede gibt es bzgl. Programmierung zwischen mvBlueFOX und mvBlueFOX3?

mvBlueFOX, mvBlueFOX-M, mvBlueFOX-MLC, mvBlueFOX-IGC, mvBlueFOX3

Für alle MATRIX VISION Produkte gibt es die einheitliche Treiber-Schnittstelle mvIMPACT Acquire. Der einzige Unterschied zwischen

ist das Interface Layout.

Für mvBlueFOX gibt es das MATRIX VISION spezifische Interface Layout "DeviceSpecific".
Der mvBlueFOX3 dagegen basiert auf die Bildverarbeitungsstandards USB3 Vision sowie "GenICam".

USB3 Vision regelt die Kommunikation zwischen Bilderfassungsgerät und Anwendung über USB 3.0. Der GenICam Standard vereinheitlicht den Zugriff auf Parameter von Geräten. Zusätzlich benennt der Standard über die Standard Feature Naming Convention, welche Parameter sowie Einstellmöglichkeiten es gibt. Die aktuelle SFNC gibt es auf der EMVA-Website.

Was bedeutet das für die Programmierung und der Übernahme von "altem" Programmcode bei einem Kamerawechsel?

Im Grunde genommen kann der auf mvIMPACT Acquire basierte Programmcode zum größten Teil übernommen werden. D.h., das

  • Ansprechen und Öffnen der Kamera sowie das
  • Erfassen der Bilder

bleiben gleich. Dies sind allgemeine Klassen und Funktionen (Common), die für alle Interface Layouts zur Verfügung stehen.

Was sich ändert, ist der Weg, wie man Parameter der Kamera einstellt.

Dazu gehören auch HRTC-Programme, die mittels Counter und Timer in GenICam realisiert werden können. Das folgende Beispiel zeigt, wie Sie über das DeviceSpecific Interface Layout die Belichtungszeit auf 10000 us setzen:

#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 );
}

Um diesen Code mit der mvBlueFOX3 verwenden zu können, müssen Sie nur den Teil der Parametrisierung auf das GenICam Interface Layout umstellen. Die rotmarkierten Bereiche können übernommen und müssen daher nicht geändert werden:

#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 );
}

Der Programm ist sehr vereinfacht. Beispielsweise darf nur eine Kamera der Familie angeschlossen sein, sonst weiß das Programm nicht, welche Kamera verwendet werden soll. Ausführliche Programmbeispiele finden Sie in unseren API-Handbüchern: für C, für C++, für .NET.

Der Wechsel hin zum GenICam Interface Layout bringt natürlich weitere Vorteile:

Sie können andere USB3 Vision / GigE Vision / GenICam-kompatible Geräte mit dem gleichen Programmcode verwenden! Das ist auch der Grund, weshalb es für diese Produkte auch einen einheitlichen mvGenTL_Acquire Treiber gibt.

Das müssen nicht unbedingt MATRIX VISION Kameras sein. Wenn Sie beispielsweise im oberen Code die folgende Zeile

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

durch

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

ersetzen, können Sie mit dem gleichen Programmcode eine GigE Vision kompatible Kamera wie die mvBlueCOUGAR-X betreiben.

Sie sehen, dass Sie als Kunde durch die Unterstützung von Bildverarbeitungsstandards nur profitieren können. Sie haben die freie Hersteller-Wahl und sind nicht mehr gebunden. Achten Sie daher bei der Wahl Ihrer BV-Komponenten darauf, dass diese die Standards unterstützen.

Zurück