This example also includes a small command-line interface. The following parameters can be passed to the application from the command line:
The continuous acquisition is similar to the single capture. The only major difference is, that this sample will continuously request images from the device. This is done without the need of a separate thread here but instead the keyboard is checked for input after every image captured. This is not the most elegant approach but the most portable and simple in this scenario.
First of all the user is prompted to select the device he wants to use for this sample:
Then after the device has been initialised successfully image requests will constantly be sent to the drivers request queue and the application waits for the results:
int requestResult = DMR_NO_ERROR;
int requestCount = 0;
if( boSingleShotMode )
{
fi.imageRequestSingle();
++requestCount;
}
else
{
while( ( requestResult = fi.imageRequestSingle() ) == DMR_NO_ERROR )
{
++requestCount;
}
}
if( requestResult != DEV_NO_FREE_REQUEST_AVAILABLE )
{
cout << "Last result: " << requestResult << "(" << ImpactAcquireException::getErrorCodeAsString( requestResult ) << "), ";
}
cout << requestCount << " buffers requested";
if( ss.requestCount.hasMaxValue() )
{
cout << ", max request count: " << ss.requestCount.getMaxValue();
}
cout << endl;
cout << "Press <<ENTER>> to end the application!!" << endl;
manuallyStartAcquisitionIfNeeded( pDev, fi );
const Request* pRequest = 0;
const unsigned int timeout_ms = 8000;
int requestNr = -1;
bool boError = false;
while( !boError )
{
requestNr = fi.imageRequestWaitFor( timeout_ms );
if( fi.isRequestNrValid( requestNr ) )
{
pRequest = fi.getRequest( requestNr );
if( pRequest->isOK() )
{
}
else
{
cout << "*** Error: request not OK, result: " << pRequest->requestResult << endl;
boError = true;
}
fi.imageRequestUnlock( requestNr );
fi.imageRequestSingle();
}
else
{
cout << "imageRequestWaitFor failed (" << requestNr << ", " << ImpactAcquireException::getErrorCodeAsString( requestNr ) << ")"
<< ", timeout value too small?" << endl;
boError = true;
}
if( waitForInput( 0, STDOUT_FILENO ) != 0 )
{
cout << " == " << __FUNCTION__ << " finished by user - " << endl;
break;
}
}
The image attached to the request can then be processed and/or displayed if the request does not report an error.
When the image is no longer needed you have to unlock the image buffer as otherwise the driver will refuse to use it again. This makes sure, that no image, that is still used by the user will be overwritten by the device:
#if !defined(linux) && !defined(__linux) && !defined(__linux__) && !defined(__APPLE__)
# error Sorry! Code for Unix flavoured operating systems only!
#endif
#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <apps/Common/exampleHelper.h>
#include <mvIMPACT_CPP/mvIMPACT_acquire.h>
#include <mvIMPACT_CPP/mvIMPACT_acquire_GenICam.h>
#ifdef MALLOC_TRACE
# include <mcheck.h>
#endif
#define PRESS_A_KEY_AND_RETURN \
cout << "Press a key..." << endl; \
getchar(); \
return 0;
using namespace std;
static bool s_boTerminated = false;
void liveLoop(
Device* pDev,
const string& settingName,
bool boSingleShotMode )
{
if( !settingName.empty() )
{
cout << "Trying to load setting " << settingName << "..." << endl;
if( result != DMR_NO_ERROR )
{
cout << "loadSetting( \"" << settingName << "\" ); call failed: " << ImpactAcquireException::getErrorCodeAsString( result ) << endl;
}
}
{
}
int requestCount = 0;
if( boSingleShotMode )
{
++requestCount;
}
else
{
{
++requestCount;
}
}
if( ( result != DMR_NO_ERROR ) && ( result != DEV_NO_FREE_REQUEST_AVAILABLE ) )
{
cout << "'FunctionInterface.imageRequestSingle' returned with an unexpected result: " << result
}
cout << requestCount << " buffer" << ( ( requestCount > 1 ) ? "s" : "" ) << " requested";
{
}
cout << endl;
cout << "Press <<ENTER>> to end the application!!" << endl;
manuallyStartAcquisitionIfNeeded( pDev, fi );
const unsigned int timeout_ms = 10000;
unsigned int cnt = 0;
while( !s_boTerminated )
{
{
{
++cnt;
if( cnt % 10 == 0 )
{
cout << cnt <<
": Info from " << pDev->
serial.
read()
}
}
else
{
}
if( !boSingleShotMode )
{
}
}
if( boSingleShotMode || ( waitForInput( 0, STDOUT_FILENO ) != 0 ) )
{
s_boTerminated = true;
}
}
if( !boSingleShotMode )
{
manuallyStopAcquisitionIfNeeded( pDev, fi );
}
}
int main( int argc, char* argv[] )
{
#ifdef MALLOC_TRACE
mtrace();
#endif
cout << " ++ starting application...." << endl;
string settingName;
int width = -1;
int height = -1;
string pixelFormat;
string acquisitionMode;
string deviceSerial;
int defaultRequestCount = -1;
for( int i = 1; i < argc; i++ )
{
const string arg( argv[i] );
if( arg.find( "-a" ) == 0 )
{
acquisitionMode = arg.substr( 2 );
}
else if( arg.find( "-drc" ) == 0 )
{
defaultRequestCount = atoi( arg.substr( 4 ).c_str() );
}
else if( arg.find( "-h" ) == 0 )
{
height = atoi( arg.substr( 2 ).c_str() );
}
else if( arg.find( "-p" ) == 0 )
{
pixelFormat = arg.substr( 2 );
}
else if( arg.find( "-s" ) == 0 )
{
deviceSerial = arg.substr( 2 );
}
else if( arg.find( "-w" ) == 0 )
{
width = atoi( arg.substr( 2 ).c_str() );
}
else
{
settingName = string( argv[1] );
}
}
if( argc <= 1 )
{
cout << "Available command line parameters:" << endl
<< endl
<< "-a<mode> to set the acquisition mode" << endl
<< "-h<height> to set the AOI width" << endl
<< "-p<pixelFormat> to set the pixel format" << endl
<< "-s<serialNumber> to pre-select a certain device. If this device can be found no further user interaction is needed" << endl
<< "-w<width> to set the AOI width" << endl
<< "-drc<bufferCount> to specify the default request count" << endl
<< "any other string will be interpreted as a name of a setting to load" << endl;
}
bool bGoOn = true;
while( bGoOn )
{
if( !deviceSerial.empty() )
{
if( pDev )
{
}
}
if( !pDev )
{
pDev = getDeviceFromUserInput( devMgr );
}
if( pDev )
{
cout <<
"Initialising device: " << pDev->
serial.
read() <<
". This might take some time..." << endl
try
{
if( defaultRequestCount > 0 )
{
cout << "Setting default request count to " << defaultRequestCount << endl;
}
{
{
if( width > 0 )
{
ifc.width.write( width );
}
if( height > 0 )
{
ifc.height.write( height );
}
if( !pixelFormat.empty() )
{
ifc.pixelFormat.writeS( pixelFormat );
}
if( !acquisitionMode.empty() )
{
ac.acquisitionMode.writeS( acquisitionMode );
}
acquisitionMode = ac.acquisitionMode.readS();
cout << "Device set up to " << ifc.pixelFormat.readS() << " " << ifc.width.read() << "x" << ifc.height.read() << endl;
}
break;
{
if( width > 0 )
{
cs.aoiWidth.write( width );
}
if( height > 0 )
{
cs.aoiHeight.write( height );
}
cout << "Device set up to " << cs.aoiWidth.read() << "x" << cs.aoiHeight.read() << endl;
}
break;
default:
break;
}
cout << "starting live loop" << endl;
liveLoop( pDev, settingName, acquisitionMode == "SingleFrame" );
cout << "finished live loop" << endl;
}
{
cout <<
"*** " << __FUNCTION__ <<
" - An error occurred while opening the device " << pDev->
serial.
read()
}
}
else
{
cout << "Unable to get device!";
break;
}
if( waitForInput( 0, STDOUT_FILENO ) != 0 )
{
break;
}
}
cout << " -- ending application...." << endl;
return 0;
}
A base class for camera related settings(Device specific interface layout only).
Definition mvIMPACT_acquire.h:18808
std::string name(void) const
Returns the name of the component referenced by this object.
Definition mvIMPACT_acquire.h:1206
bool isValid(void) const
Checks if the internal component referenced by this object is still valid.
Definition mvIMPACT_acquire.h:1721
Grants access to devices that can be operated by this software interface.
Definition mvIMPACT_acquire.h:7171
Device * getDeviceBySerial(const std::string &serial="", unsigned int devNr=0, char wildcard=' *') const
Tries to locate a device via the serial number.
Definition mvIMPACT_acquire.h:7524
This class and its functions represent an actual device detected by this interface in the current sys...
Definition mvIMPACT_acquire.h:6118
PropertyS serial
A string property (read-only) containing the serial number of this device.
Definition mvIMPACT_acquire.h:6551
void close(void)
Closes an opened device.
Definition mvIMPACT_acquire.h:6272
void open(void)
Opens a device.
Definition mvIMPACT_acquire.h:6420
PropertyI defaultRequestCount
An integer property that defines the number of mvIMPACT::acquire::Request objects to be created when ...
Definition mvIMPACT_acquire.h:6672
PropertyIDeviceInterfaceLayout interfaceLayout
An enumerated integer property which can be used to define which interface layout shall be used when ...
Definition mvIMPACT_acquire.h:6644
PropertyIAcquisitionStartStopBehaviour acquisitionStartStopBehaviour
An enumerated integer property defining the start/stop behaviour during acquisition of this driver in...
Definition mvIMPACT_acquire.h:6800
ZYX read(int index=0) const
Reads a value from a property.
Definition mvIMPACT_acquire.h:4300
ZYX getMaxValue(void) const
Reads the maximum value from a property.
Definition mvIMPACT_acquire.h:4325
const EnumPropertyI & write(ZYX value, int index=0) const
Writes one value to the property.
Definition mvIMPACT_acquire.h:4426
The function interface to devices supported by this interface.
Definition mvIMPACT_acquire.h:10758
int imageRequestWaitFor(int timeout_ms, int queueNr=0) const
Waits for a request object to become ready.
Definition mvIMPACT_acquire.h:11616
int loadSetting(const std::string &name, TStorageFlag storageFlags=sfNative, TScope scope=sGlobal) const
Loads a previously stored setting.
Definition mvIMPACT_acquire.h:11836
int imageRequestSingle(ImageRequestControl *pImageRequestControl=0, int *pRequestUsed=0) const
Sends an image request to the mvIMPACT::acquire::Device driver.
Definition mvIMPACT_acquire.h:11503
bool isRequestNrValid(int nr) const
Check if nr specifies a valid mvIMPACT::acquire::Request.
Definition mvIMPACT_acquire.h:11763
int imageRequestReset(int requestCtrlNr, int mode) const
Deletes all requests currently queued for the specified mvIMPACT::acquire::ImageRequestControl.
Definition mvIMPACT_acquire.h:11450
Request * getRequest(int nr) const
Returns a pointer to the desired mvIMPACT::acquire::Request.
Definition mvIMPACT_acquire.h:11189
Category for the acquisition and trigger control features.
Definition mvIMPACT_acquire_GenICam.h:2115
Base class for image processing related properties.
Definition mvIMPACT_acquire.h:13205
PropertyIColorProcessingMode colorProcessing
An enumerated integer property defining what kind of color processing shall be applied to the raw ima...
Definition mvIMPACT_acquire.h:13618
A base class for exceptions generated by Impact Acquire.
Definition mvIMPACT_acquire.h:256
std::string getErrorCodeAsString(void) const
Returns a string representation of the error associated with the exception.
Definition mvIMPACT_acquire.h:288
int getErrorCode(void) const
Returns a unique numerical representation for this error.
Definition mvIMPACT_acquire.h:275
std::string read(int index=0) const
Reads a value from a property.
Definition mvIMPACT_acquire.h:5323
std::string readS(int index=0, const std::string &format="") const
Reads data from this property as a string.
Definition mvIMPACT_acquire.h:3340
bool hasMaxValue(void) const
Checks if a maximum value is defined for this property.
Definition mvIMPACT_acquire.h:3305
Contains information about a captured buffer.
Definition mvIMPACT_acquire.h:8640
PropertyI imageHeight
An integer property (read-only) containing the height of the image in pixels.
Definition mvIMPACT_acquire.h:10331
bool isOK(void) const
Convenience function to check if a request has been processed successfully.
Definition mvIMPACT_acquire.h:9474
PropertyIRequestResult requestResult
An enumerated integer property (read-only) defining the result of this request.
Definition mvIMPACT_acquire.h:9780
PropertyI imageWidth
An integer property (read-only) containing the width of the image in pixels.
Definition mvIMPACT_acquire.h:10320
PropertyIImageBufferPixelFormat imagePixelFormat
An enumerated integer property (read-only) containing the pixel format of this image.
Definition mvIMPACT_acquire.h:10132
int unlock(void)
Unlocks the request for the driver again.
Definition mvIMPACT_acquire.h:9614
PropertyI imageLinePitch
An integer property (read-only) containing the offset (in bytes) to the next line of each channel bel...
Definition mvIMPACT_acquire.h:10262
Contains basic statistical information.
Definition mvIMPACT_acquire.h:14509
PropertyF framesPerSecond
A float property (read-only) containing the current number of frames captured per second.
Definition mvIMPACT_acquire.h:14586
PropertyF captureTime_s
A float property (read-only) containing the overall time an image request spent in the device drivers...
Definition mvIMPACT_acquire.h:14560
PropertyI errorCount
An integer property (read-only) containing the overall count of image requests which returned with an...
Definition mvIMPACT_acquire.h:14568
A base class for accessing settings that control the overall behaviour of a device driver.
Definition mvIMPACT_acquire.h:14728
PropertyI requestCount
An integer property defining the number of requests allocated by the driver.
Definition mvIMPACT_acquire.h:14781
TDMR_ERROR
Errors reported by the device manager.
Definition mvDriverBaseEnums.h:2601
@ dilDeviceSpecific
A device specific interface shall be used(deprecated for all GenICamâ„¢ compliant devices).
Definition mvDriverBaseEnums.h:2133
@ dilGenICam
A GenICamâ„¢ like interface layout shall be used.
Definition mvDriverBaseEnums.h:2150
This namespace contains classes and functions belonging to the image acquisition module of this SDK.
Definition mvCommonDataTypes.h:34