To capture an image an instance of the class mvIMPACT.acquire.FunctionInterface must be created. This class can be constructed by passing a pointer to the mvIMPACT.acquire.Device object obtained from the mvIMPACT.acquire.DeviceManager to the class constructor.
The function interface class provides access to most of the devices executable functions, while most of the settings (e.g. the exposure time or the trigger mode) are implemented as properties (see e.g. mvIMPACT.acquire.Property for details).
This is how a continuous acquisition from a user selected device can be achieved:
import mvIMPACT.acquire.*;
public class ContinuousCapture
{
static
{
try
{
System.loadLibrary( "mvIMPACT_Acquire.java" );
}
catch( UnsatisfiedLinkError e )
{
System.err.println( "Native code library failed to load. Make sure the 'mvIMPACT_Acquire.java' library can be found in the systems search path.\n" + e );
System.exit( 1 );
}
}
public static void main( String[] args )
{
DeviceManager devMgr = new DeviceManager();
Device pDev = mvIMPACT.acquire.examples.helper.DeviceAccess.getDeviceFromUserInput( devMgr );
if( pDev == null )
{
System.out.print( "Unable to continue! " );
mvIMPACT.acquire.examples.helper.DeviceAccess.waitForENTER();
System.exit( 1 );
}
System.out.println( "Initialising the device. This might take some time..." );
try
{
pDev.open();
}
catch( ImpactAcquireException e )
{
System.out.println( "An error occurred while opening device " + pDev.getSerial().read() +
"(error code: " + e.getMessage() + ")." );
mvIMPACT.acquire.examples.helper.DeviceAccess.waitForENTER();
System.exit( 1 );
}
CaptureThread captureThread = new CaptureThread( pDev );
captureThread.start();
mvIMPACT.acquire.examples.helper.DeviceAccess.waitForENTER();
captureThread.terminate();
try
{
captureThread.join();
}
catch( Exception e )
{
System.out.println( e.getMessage() );
}
}
}
The required additional class CaptureThread
might look like this:
import mvIMPACT.acquire.*;
public class CaptureThread extends Thread
{
private static final boolean isWindows_ = System.getProperty( "os.name" ).startsWith( "Windows" );
private Device pDev_;
private boolean terminated_ = false;
public CaptureThread( Device pDev )
{
pDev_ = pDev;
}
public void run()
{
if( isWindows_ )
{
System.out.println( "\n\nSince you are running on a Windows platform you could use the display module belonging to this SDK. To try this simply remove the comments wherever the 'window_' variable is used. As Java does not support something like '#ifdef' we did not come up with anything smarter. Suggestions welcome!!!\n\n" );
}
Statistics statistics = new Statistics( pDev_ );
FunctionInterface fi = new FunctionInterface( pDev_ );
int result = TDMR_ERROR.DMR_NO_ERROR;
while( ( result = fi.imageRequestSingle() ) == TDMR_ERROR.DMR_NO_ERROR ) { };
if( result != TDMR_ERROR.DEV_NO_FREE_REQUEST_AVAILABLE )
{
System.out.println( String.format( "'FunctionInterface.imageRequestSingle' returned with an unexpected result: %d(%s)", result, ImpactAcquireException.getErrorCodeAsString( result ) ) );
}
mvIMPACT.acquire.examples.helper.DeviceAccess.manuallyStartAcquisitionIfNeeded( pDev_, fi );
Request pRequest = null;
Request pPreviousRequest = null;
int timeout_ms = 500;
int cnt = 0;
int requestNr = acquire.getINVALID_ID();
while( !terminated_ )
{
requestNr = fi.imageRequestWaitFor( timeout_ms );
pRequest = fi.isRequestNrValid( requestNr ) ? fi.getRequest( requestNr ) : null;
if( pRequest != null )
{
if( pRequest.isOK() )
{
++cnt;
if( cnt % 100 == 0 )
{
System.out.println( String.format( "Info from %s: %s: %s, %s: %s, %s: %s", pDev_.getSerial().read(),
statistics.getFramesPerSecond().name(), statistics.getFramesPerSecond().readS(),
statistics.getErrorCount().name(), statistics.getErrorCount().readS(),
statistics.getCaptureTime_s().name(), statistics.getCaptureTime_s().readS() ) );
}
}
else
{
System.out.println( "Error: " + pRequest.getRequestResult().readS() );
}
if( pPreviousRequest != null )
{
pPreviousRequest.unlock();
}
pPreviousRequest = pRequest;
fi.imageRequestSingle();
}
}
mvIMPACT.acquire.examples.helper.DeviceAccess.manuallyStopAcquisitionIfNeeded( pDev_, fi );
if( pRequest != null )
{
pRequest.unlock();
}
fi.imageRequestReset( 0, 0 );
}
public void terminate()
{
terminated_ = true;
}
}
This sample contains everything the user needs to do to continuously capture images including all initialization work and error handling for every source of error one can think of.
- Note
- A much more specific summary of the available sample applications can be found at the Typical Usage Scenarios And Example Applications page.
Several example applications will provide an even better understanding of the interface.
The 'GenICam' vs. 'DeviceSpecific' Interface Layout chapter will provide more details on how to work with properties.