It can also be helpful to familiarize yourself with the ImageFormatControl_C and Exposure_C examples as these provide a strong introduction to camera customization.
The sequencer is another very powerful tool that can be used to create and store multiple sets of customized image settings. A very useful application of the sequencer is creating high dynamic range images.
This example is probably the most complex and definitely the longest. As such, the configuration has been split between three functions. The first prepares the camera to set the sequences, the second sets the settings for a single sequence (it is run five times), and the third configures the camera to use the sequencer when it acquires images.
#include "stdio.h"
#include "string.h"
#define MAX_BUFF_LEN 256
{
}
{
{
printf(
"Unable to retrieve node readability, with error %s [%d]...\n\n",
GetLastErrorMessage(), err);
}
return pbReadable;
}
{
{
printf(
"Unable to retrieve node writability, with error %s [%d]...\n\n",
GetLastErrorMessage(), err);
}
return pbWritable;
}
{
printf("Unable to get %s (%s %s retrieval failed).\n\n", node, name, node);
printf("The %s may not be readable or writable on all camera models...\n", node);
printf("Please try a Blackfly S camera.\n\n");
}
{
printf("\n\n*** SEQUENCER CONFIGURATION ***\n\n");
int64_t sequencerModeOff = 0;
err =
spinNodeMapGetNode(hNodeMap,
"SequencerConfigurationValid", &hSequencerConfigurationValid);
{
}
{
}
{
}
if (!
IsReadable(hSequencerConfigurationValidCurrent))
{
}
{
}
{
}
if (hSequencerConfigurationValidCurrent == hSequencerConfigurationValidYes)
{
{
}
{
}
{
}
{
}
{
printf("Unable to disable sequencer mode (entry int value retrieval). Aborting with error %d...\n\n", err);
}
{
}
{
printf("Unable to disable sequencer mode (entry int value setting). Aborting with error %d...\n\n", err);
}
}
printf("Sequencer mode disabled...\n");
int64_t exposureAutoOff;
{
}
{
}
{
}
{
}
{
printf("Unable to disable automatic exposure (entry int value retrieval). Aborting with error %d...\n\n", err);
}
{
}
{
printf("Unable to disable automatic exposure (entry int value setting). Aborting with error %d...\n\n", err);
}
printf("Automatic exposure disabled...\n");
int64_t gainAutoOff;
{
}
{
}
{
}
{
}
{
printf("Unable to disable automatic gain. Aborting with error %d...\n\n", err);
}
{
}
{
printf("Unable to disable automatic gain. Aborting with error %d...\n\n", err);
}
printf("Automatic gain disabled...\n");
int64_t sequencerConfigurationModeOn = 0;
err =
spinNodeMapGetNode(hNodeMap,
"SequencerConfigurationMode", &hSequencerConfigurationMode);
{
}
{
}
{
}
{
}
{
printf("Unable to enable sequencer configuration mode. Aborting with error %d...\n\n", err);
}
{
}
{
printf("Unable to enable sequencer configuration mode. Aborting with error %d...\n\n", err);
}
printf("Sequencer configuration mode enabled...\n\n");
return 0;
}
unsigned int sequenceNumber,
int64_t widthToSet,
int64_t heightToSet,
double exposureTimeToSet,
double gainToSet)
{
{
printf("Unable to select current sequence. Aborting with error %d...\n\n", err);
}
{
printf("Unable to select current sequence. Aborting with error %d...\n\n", err);
}
{
printf("Unable to select current sequence. Aborting with error %d...\n\n", err);
}
printf("Customizing sequence %d...\n", sequenceNumber);
int64_t widthInc = 0;
{
printf("Unable to set width. Aborting with error %d...\n\n", err);
}
{
{
printf("Unable to set width. Aborting with error %d...\n\n", err);
}
if (widthToSet % widthInc != 0)
{
widthToSet = (widthToSet / widthInc) * widthInc;
}
{
printf("Unable to set width. Aborting with error %d...\n\n", err);
}
printf("\tWidth set to %d...\n", (int)widthToSet);
}
else
{
printf("\tUnable to get or set width; width for sequencer not readable/writable on all camera models...\n");
}
int64_t heightInc = 0;
{
printf("Unable to set height. Aborting with error %d...\n\n", err);
}
{
{
printf("Unable to set height. Aborting with error %d...\n\n", err);
}
if (heightToSet % heightInc != 0)
{
heightToSet = (heightToSet / heightInc) * heightInc;
}
{
printf("Unable to set height. Aborting with error %d...\n\n", err);
}
printf("\tHeight set to %d...\n", (int)heightToSet);
}
else
{
printf("\tUnable to set height; height for sequencer not readable/writable on all camera models...\n");
}
{
printf("Unable to set exposure. Aborting with error %d...\n\n", err);
}
{
printf("Unable to set exposure. Aborting with error %d...\n\n", err);
}
{
printf("Unable to set exposure. Aborting with error %d...\n\n", err);
}
printf("\tExposure time set to %f...\n", exposureTimeToSet);
{
printf("Unable to set gain. Aborting with error %d...\n\n", err);
}
{
printf("Unable to set gain. Aborting with error %d...\n\n", err);
}
{
printf("Unable to set gain. Aborting with error %d...\n\n", err);
}
printf("\tGain set to %f...\n", gainToSet);
int64_t sequencerTriggerSourceFrameStart = 0;
{
printf("Unable to set trigger source. Aborting with error %d...\n\n", err);
}
{
printf("Unable to set trigger source. Aborting with error %d...\n\n", err);
}
{
printf("Unable to set trigger source. Aborting with error %d...\n\n", err);
}
if (!
IsReadable(hSequencerTriggerSourceFrameStart))
{
printf("Unable to set trigger source. Aborting with error %d...\n\n", err);
}
{
printf("Unable to set trigger source. Aborting with error %d...\n\n", err);
}
{
printf("Unable to set trigger source. Aborting with error %d...\n\n", err);
}
{
printf("Unable to set trigger source. Aborting with error %d...\n\n", err);
}
printf("\tTrigger source set to start of frame...\n");
const unsigned int finalSequenceIndex = 4;
unsigned int nextSequence = 0;
{
printf("Unable to set next sequence. Aborting with err %d...\n\n", err);
}
{
printf("Unable to set next sequence. Aborting with err %d...\n\n", err);
}
if (sequenceNumber != finalSequenceIndex)
{
nextSequence = sequenceNumber + 1;
}
{
printf("Unable to set next sequence. Aborting with err %d...\n\n", err);
}
printf("\tNext sequence set to %d...\n", nextSequence);
{
printf("Unable to save sequence. Aborting with err %d...\n\n", err);
}
{
printf("Unable to save sequence. Aborting with err %d...\n\n", err);
}
{
printf("Unable to save sequence. Aborting with err %d...\n\n", err);
}
printf("\tSequence %d saved...\n\n", sequenceNumber);
return 0;
}
{
int64_t sequencerConfigurationModeOff = 0;
err =
spinNodeMapGetNode(hNodeMap,
"SequencerConfigurationMode", &hSequencerConfigurationMode);
{
}
{
}
{
}
{
}
{
printf("Unable to disable sequencer configuration mode. Aborting with error %d...\n\n", err);
}
{
printf("Unable to disable sequencer configuration mode. Aborting with error %d...\n\n", err);
}
printf("Sequencer configuration mode disabled...\n");
int64_t sequencerModeOn = 0;
{
}
{
}
{
}
{
}
{
printf("Unable to enable sequencer mode. Aborting with error %d...\n\n", err);
}
{
}
{
printf("Unable to enable sequencer mode. Aborting with error %d...\n\n", err);
}
printf("Sequencer mode enabled...\n");
int64_t sequencerConfigurationValidCurrent = 0;
int64_t sequencerConfigurationValidYes = 0;
err =
spinNodeMapGetNode(hNodeMap,
"SequencerConfigurationValid", &hSequencerConfigurationValid);
{
}
{
}
{
}
if (!
IsReadable(hSequencerConfigurationValidCurrent))
{
}
{
}
{
}
{
printf(
"Unable to validate sequencer configuration ('current' value retrieval). Aborting with error %d...\n\n",
err);
}
{
printf(
"Unable to validate sequencer configuration ('yes' value retrieval). Aborting with error %d...\n\n", err);
}
if (sequencerConfigurationValidCurrent != sequencerConfigurationValidYes)
{
printf("Sequencer configuration not valid. Aborting with error %d...\n\n", err);
}
printf("Sequencer configuration valid...\n\n");
return 0;
}
{
int64_t sequencerModeOff = 0;
{
printf("Unable to enable sequencer mode. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable sequencer mode. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable sequencer mode. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable sequencer mode. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable sequencer mode. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable sequencer mode. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable sequencer mode. Aborting with error %d...\n\n", err);
}
printf("Sequencer mode disabled...\n");
int64_t exposureAutoContinuous;
{
printf("Unable to enable automatic exposure. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable automatic exposure. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable automatic exposure. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable automatic exposure. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable automatic exposure. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable automatic exposure. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable automatic exposure. Aborting with error %d...\n\n", err);
}
printf("Automatic exposure enabled...\n");
int64_t gainAutoContinuous;
{
printf("Unable to enable automatic gain. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable automatic gain. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable automatic gain. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable automatic gain. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable automatic gain. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable automatic gain. Aborting with error %d...\n\n", err);
}
{
printf("Unable to enable automatic gain. Aborting with error %d...\n\n", err);
}
printf("Automatic gain enabled...\n\n");
return 0;
}
{
unsigned int i = 0;
printf("\n*** DEVICE INFORMATION ***\n\n");
{
printf("Unable to retrieve node. Non-fatal error %d...\n\n", err);
}
{
printf("Unable to retrieve node. Non-fatal error %d...\n\n", err);
}
size_t numFeatures = 0;
{
printf("Unable to retrieve number of nodes. Non-fatal error %d...\n\n", err);
}
for (i = 0; i < numFeatures; i++)
{
{
printf("Unable to retrieve node. Non-fatal error %d...\n\n", err);
continue;
}
{
strcpy(featureName, "Unknown name");
}
{
{
printf("Unable to retrieve node type. Non-fatal error %d...\n\n", err);
continue;
}
}
else
{
printf("%s: Node not readable\n", featureName);
continue;
}
{
strcpy(featureValue, "Unknown value");
}
printf("%s: %s\n", featureName, featureValue);
}
return 0;
}
{
printf("\n*** IMAGE ACQUISITION ***\n\n");
int64_t acquisitionModeContinuous = 0;
{
printf("Unable to set acquisition mode to continuous (node retrieval). Aborting with error %d...\n\n", err);
}
{
printf("Unable to set acquisition mode to continuous (node retrieval). Aborting with error %d...\n\n", err);
}
{
printf(
"Unable to set acquisition mode to continuous (entry 'continuous' retrieval). Aborting with error "
"%d...\n\n",
err);
}
{
printf(
"Unable to set acquisition mode to continuous (entry 'continuous' retrieval). Aborting with error "
"%d...\n\n",
err);
}
{
printf(
"Unable to set acquisition mode to continuous (entry int value retrieval). Aborting with error %d...\n\n",
err);
}
{
printf("Unable to set acquisition mode to continuous (node retrieval). Aborting with error %d...\n\n", err);
}
{
printf(
"Unable to set acquisition mode to continuous (entry int value setting). Aborting with error %d...\n\n",
err);
}
printf("Acquisition mode set to continuous...\n");
{
printf("Unable to begin image acquisition. Aborting with error %d...\n\n", err);
}
printf("Acquiring images...\n");
{
strcpy(deviceSerialNumber, "");
lenDeviceSerialNumber = 0;
}
else
{
{
strcpy(deviceSerialNumber, "");
lenDeviceSerialNumber = 0;
}
else
{
err =
spinStringGetValue(hDeviceSerialNumber, deviceSerialNumber, &lenDeviceSerialNumber);
{
strcpy(deviceSerialNumber, "");
lenDeviceSerialNumber = 0;
}
printf("Device serial number retrieved as %s...\n", deviceSerialNumber);
}
}
printf("\n");
const unsigned int k_numImages = 10;
unsigned int imageCnt = 0;
{
printf("Unable to create image processor. Non-fatal error %d...\n\n", err);
}
{
printf("Unable to set image processor color processing method. Non-fatal error %d...\n\n", err);
}
for (imageCnt = 0; imageCnt < k_numImages; imageCnt++)
{
{
printf("Unable to get next image. Non-fatal error %d...\n\n", err);
continue;
}
{
printf("Unable to determine image completion. Non-fatal error %d...\n\n", err);
}
if (isIncomplete)
{
{
printf("Unable to retrieve image status. Non-fatal error %d...\n\n", err);
}
else
{
printf("Image incomplete with image status %d...\n", imageStatus);
}
}
if (hasFailed)
{
{
printf("Unable to release image. Non-fatal error %d...\n\n", err);
}
continue;
}
size_t width = 0;
size_t height = 0;
{
printf("Unable to retrieve image width. Non-fatal error %d...\n", err);
}
{
printf("Unable to retrieve image height. Non-fatal error %d...\n", err);
}
printf("Grabbed image %u, width = %u, height = %u\n", imageCnt, (unsigned int)width, (unsigned int)height);
{
printf("Unable to create image. Non-fatal error %d...\n\n", err);
}
{
printf("Unable to convert image. Non-fatal error %d...\n\n", err);
}
if (lenDeviceSerialNumber == 0)
{
sprintf(filename, "Sequencer-C-%d.jpg", imageCnt);
}
else
{
sprintf(filename, "Sequencer-C-%s-%d.jpg", deviceSerialNumber, imageCnt);
}
{
printf("Unable to save image. Non-fatal error %d...\n", err);
}
else
{
printf("Image saved at %s\n\n", filename);
}
{
printf("Unable to destroy image. Non-fatal error %d...\n\n", err);
}
{
printf("Unable to release image. Non-fatal error %d...\n\n", err);
}
}
{
printf("Unable to destroy image processor. Non-fatal error %d...\n\n", err);
}
{
printf("Unable to end acquisition. Non-fatal error %d...\n\n", err);
}
return 0;
}
{
int result = 0;
{
printf("Unable to retrieve TL device nodemap. Non-fatal error %d...\n\n", err);
}
else
{
}
{
printf("Unable to initialize camera. Aborting with error %d...\n\n", err);
}
{
printf("Unable to retrieve GenICam nodemap. Aborting with error %d...\n\n", err);
}
{
}
const unsigned int k_numSequences = 5;
int64_t widthMax = 0;
{
printf("Unable to get max width (node retrieval). Aborting with error %d...\n\n", err);
}
{
printf("Unable to get max width (node retrieval). Aborting with error %d...\n\n", err);
}
{
printf("Unable to get max width (max retrieval). Aborting with error %d...\n\n", err);
}
int64_t heightMax = 0;
{
printf("Unable to get max height (node retrieval). Aborting with error %d...\n\n", err);
}
{
printf("Unable to get max height (node retrieval). Aborting with error %d...\n\n", err);
}
{
printf("Unable to get max height (max retrieval). Aborting with error %d...\n\n", err);
}
const double exposureTimeMaxToSet = 2000000.0;
double exposureTimeMax = 0.0;
double exposureTimeMin = 0.0;
{
printf("Unable to retrieve exposure time node. Aborting with error %d...\n\n", err);
}
{
printf("Unable to retrieve exposure time node. Aborting with error %d...\n\n", err);
}
{
printf("Unable to retrieve maximum exposure time. Aborting with error %d...\n\n", err);
}
if (exposureTimeMax > exposureTimeMaxToSet)
{
exposureTimeMax = exposureTimeMaxToSet;
}
{
printf("Unable to retrieve minimum exposure time. Aborting with error %d...\n\n", err);
}
double gainMax = 0.0;
double gainMin = 0.0;
{
printf("Unable to retrieve gain node. Aborting with error %d...\n\n", err);
}
{
printf("Unable to retrieve gain node. Aborting with error %d...\n\n", err);
}
{
printf("Unable to retrieve maximum gain. Aborting with error %d...\n\n", err);
}
{
printf("Unable to retrieve minimum gain. Aborting with error %d...\n\n", err);
}
unsigned int sequenceNumber;
int64_t widthToSet = widthMax / 4;
int64_t heightToSet = heightMax / 4;
double exposureTimeToSet = exposureTimeMin;
double gainToSet = gainMin;
for (sequenceNumber = 0; sequenceNumber < k_numSequences; sequenceNumber++)
{
if (
SetSingleState(hNodeMap, sequenceNumber, widthToSet, heightToSet, exposureTimeToSet, gainToSet) != 0)
{
}
widthToSet += widthMax / 10;
heightToSet += heightMax / 10;
exposureTimeToSet += exposureTimeMax / 10.0;
gainToSet += gainMax / 50.0;
}
uint64_t timeout = (uint64_t)((exposureTimeToSet / 1000) + 1000);
{
}
if (
AcquireImages(hCam, hNodeMap, hNodeMapTLDevice, timeout) != 0)
{
}
{
}
{
printf("Unable to deinitialize camera. Non-fatal error %d...\n\n", err);
}
return result;
}
{
int errReturn = 0;
unsigned int i = 0;
FILE* tempFile;
tempFile = fopen("test.txt", "w+");
if (tempFile == NULL)
{
printf("Failed to create file in current folder. Please check "
"permissions.\n");
printf("Press Enter to exit...\n");
getchar();
}
fclose(tempFile);
remove("test.txt");
printf("Application build date: %s %s \n\n", __DATE__, __TIME__);
{
printf("Unable to retrieve system instance. Aborting with error %d...\n\n", err);
printf("\nDone! Press Enter to exit...\n");
getchar();
}
spinLibraryVersion hLibraryVersion;
printf(
"Spinnaker library version: %d.%d.%d.%d\n\n",
hLibraryVersion.major,
hLibraryVersion.minor,
hLibraryVersion.type,
hLibraryVersion.build);
{
printf("Unable to create camera list. Aborting with error %d...\n\n", err);
printf("\nDone! Press Enter to exit...\n");
getchar();
}
{
printf("Unable to retrieve camera list. Aborting with error %d...\n\n", err);
printf("\nDone! Press Enter to exit...\n");
getchar();
}
size_t numCameras = 0;
{
printf("Unable to retrieve number of cameras. Aborting with error %d...\n\n", err);
printf("\nDone! Press Enter to exit...\n");
getchar();
}
printf("Number of cameras detected: %u\n\n", (unsigned int)numCameras);
if (numCameras == 0)
{
{
printf("Unable to clear camera list. Aborting with error %d...\n\n", err);
printf("\nDone! Press Enter to exit...\n");
getchar();
}
{
printf("Unable to destroy camera list. Aborting with error %d...\n\n", err);
printf("\nDone! Press Enter to exit...\n");
getchar();
}
{
printf("Unable to release system instance. Aborting with error %d...\n\n", err);
printf("\nDone! Press Enter to exit...\n");
getchar();
}
printf("Not enough cameras!\n");
printf("Done! Press Enter to exit...\n");
getchar();
return -1;
}
for (i = 0; i < numCameras; i++)
{
printf("\nRunning example for camera %d...\n", i);
{
printf("Unable to retrieve camera from list. Aborting with error %d...\n\n", err);
errReturn = -1;
}
else
{
{
errReturn = -1;
}
}
{
errReturn = -1;
printf("Unable to release camera instance. Aborting with error %d...\n\n", err);
continue;
}
printf("Camera %d example complete...\n\n", i);
}
{
printf("Unable to clear camera list. Aborting with error %d...\n\n", err);
printf("\nDone! Press Enter to exit...\n");
getchar();
}
{
printf("Unable to destroy camera list. Aborting with error %d...\n\n", err);
printf("\nDone! Press Enter to exit...\n");
getchar();
}
{
printf("Unable to release system instance. Aborting with error %d...\n\n", err);
printf("\nDone! Press Enter to exit...\n");
getchar();
}
printf("\nDone! Press Enter to exit...\n");
getchar();
return errReturn;
}