This example demonstrates some of the methods that can be used to extract polarization quadrant images and create Stokes', AoLP, and DoLP images from the ImageUtilityPolarization class. It then demonstrates how to use some of the available methods in the ImageUtility and ImageUtilityHeatmap classes to create normalized and heatmap images.
#include <iostream>
#include <string>
#include <array>
using namespace Spinnaker;
using namespace Spinnaker::GenApi;
using namespace Spinnaker::GenICam;
using namespace std;
{
cout << endl << "*** DEVICE INFORMATION ***" << endl << endl;
try
{
FeatureList_t features;
const CCategoryPtr category = nodeMap.GetNode(
"DeviceInformation");
{
category->GetFeatures(features);
for (FeatureList_t::const_iterator it = features.begin(); it != features.end(); ++it)
{
cout << pfeatureNode->GetName() << " : ";
cout << (
IsReadable(pValue) ? pValue->ToString() :
"Node not readable");
cout << endl;
}
}
else
{
cout << "Device control information not readable." << endl;
}
}
{
cout <<
"Error: " << e.
what() << endl;
return -1;
}
return 0;
}
{
{
CEnumEntryPtr ptrPixelFormatPolarized8 = ptrPixelFormat->GetEntryByName(
"Polarized8");
CEnumEntryPtr ptrPixelFormatBayerRGPolarized8 = ptrPixelFormat->GetEntryByName(
"BayerRGPolarized8");
{
const int64_t pixelFormatPolarized8 = ptrPixelFormatPolarized8->GetValue();
ptrPixelFormat->SetIntValue(pixelFormatPolarized8);
cout << "Pixel format set to " << ptrPixelFormat->GetCurrentEntry()->GetSymbolic() << "..." << endl;
}
else if (
IsReadable(ptrPixelFormatBayerRGPolarized8))
{
const int64_t pixelFormatBayerRGPolarized8 = ptrPixelFormatBayerRGPolarized8->GetValue();
ptrPixelFormat->SetIntValue(pixelFormatBayerRGPolarized8);
cout << "Pixel format set to " << ptrPixelFormat->GetCurrentEntry()->GetSymbolic() << "..." << endl;
}
else
{
cout << "Pixel format Polarized8 or BayerRGPolarized8 not readable (entry retrieval). Aborting..." << endl;
return -1;
}
}
else
{
cout << "Pixel format not writable (enum retrieval). Aborting..." << endl;
return -1;
}
{
cout << "Unable to get or set acquisition mode to single frame (enum retrieval). Aborting..." << endl << endl;
return -1;
}
CEnumEntryPtr ptrAcquisitionModeSingleFrame = ptrAcquisitionMode->GetEntryByName(
"SingleFrame");
{
cout << "Unable to get acquisition mode to single frame (entry retrieval). Aborting..." << endl << endl;
return -1;
}
const int64_t acquisitionModeSingleFrame = ptrAcquisitionModeSingleFrame->GetValue();
ptrAcquisitionMode->SetIntValue(acquisitionModeSingleFrame);
cout << "Acquisition mode set to single frame..." << endl;
return 0;
}
{
try
{
string fullFilename;
if (!serialNumber.
empty())
{
fullFilename = serialNumber.
c_str() + filename;
fullFilename.insert(serialNumber.
length(), 1,
'-');
}
else
{
fullFilename = filename;
}
pImage->Save(fullFilename.c_str());
cout << "Image saved at " << fullFilename << endl;
cout << "Width = " << pImage->GetWidth() << ", height = " << pImage->GetHeight()
<< ", pixel format = " << pImage->GetPixelFormatName() << endl
<< endl;
}
{
cout <<
"Error: " << e.
what() << endl;
return -1;
}
return 0;
}
{
switch (quadrant)
{
return "I0";
return "I45";
return "I90";
return "I135";
default:
return "UNKNOWN_QUAD";
}
}
{
try
{
SaveImage(heatmapImage, (baseFilename +
"_Heatmap.jpg"), deviceSerialNumber);
}
{
cout <<
"Error: " << e.
what() << endl;
return -1;
}
return 1;
}
{
try
{
array<PolarizationQuadrant, 4> polarizationQuadEnums = {
for (auto polarizationQuadEnum = polarizationQuadEnums.begin();
polarizationQuadEnum != polarizationQuadEnums.end();
++polarizationQuadEnum)
{
const auto polarizationQuadImage =
SaveImage(polarizationQuadImage, (quadrantName +
".jpg"), deviceSerialNumber);
{
}
}
}
{
cout <<
"Error: " << e.
what() << endl;
return -1;
}
return 1;
}
{
try
{
SaveImage(glareReducedImage,
"Glare_Reduced.jpg", deviceSerialNumber);
}
{
cout <<
"Error: " << e.
what() << endl;
return -1;
}
return 1;
}
const string baseFilename,
{
try
{
SaveImage(normalizedImage, (baseFilename +
"_Normalized.jpg"), deviceSerialNumber);
}
{
cout <<
"Error: " << e.
what() << endl;
return -1;
}
return 1;
}
{
try
{
array<ImagePtr, 3> stokesImages = {stokesS0Image, stokesS1Image, stokesS2Image};
long long stokesAppendage = 0;
for (auto stokesImage = stokesImages.begin(); stokesImage != stokesImages.end(); ++stokesImage)
{
const string stokesName = "Stokes_S" + to_string(stokesAppendage++);
SaveImage(*stokesImage, (stokesName +
".raw"), deviceSerialNumber);
}
}
{
cout <<
"Error: " << e.
what() << endl;
return -1;
}
return 1;
}
{
try
{
SaveImage(aolpImage,
"AoLP.raw", deviceSerialNumber);
SaveImage(dolpImage,
"DoLP.raw", deviceSerialNumber);
aolpImage,
SaveImage(aolpNormalizedImage,
"AoLP_Normalized.jpg", deviceSerialNumber);
dolpImage,
SaveImage(dolpNormalizedImage,
"DoLP_Normalized.jpg", deviceSerialNumber);
{
}
}
{
cout <<
"Error: " << e.
what() << endl;
return -1;
}
return 1;
}
{
cout << endl << "*** IMAGE ACQUISITION ***" << endl << endl;
try
{
pCam->BeginAcquisition();
cout << "Acquiring an image from the polarized camera..." << endl;
CStringPtr ptrStringSerial = nodeMapTLDevice.GetNode(
"DeviceSerialNumber");
{
deviceSerialNumber = ptrStringSerial->GetValue();
cout << "Device serial number retrieved as " << deviceSerialNumber << "..." << endl;
}
cout << endl;
ImagePtr pRawPolarizedImage = pCam->GetNextImage(1000);
if (pRawPolarizedImage->IsIncomplete())
{
cout << "Image incomplete with image status " << pRawPolarizedImage->GetImageStatus() << "..." << endl
<< endl;
}
else
{
SaveImage(pRawPolarizedImage,
"Raw_Polarized_Image.jpg", deviceSerialNumber);
}
pRawPolarizedImage->Release();
cout << endl;
}
{
cout <<
"Error: " << e.
what() << endl;
return -1;
}
pCam->EndAcquisition();
return 0;
}
{
int result = 0;
try
{
INodeMap& nodeMapTLDevice = pCam->GetTLDeviceNodeMap();
pCam->Init();
{
}
pCam->DeInit();
}
{
cout <<
"Error: " << e.
what() << endl;
result = -1;
}
return result;
}
{
FILE* tempFile = fopen("test.txt", "w+");
if (tempFile == nullptr)
{
cout << "Failed to create file in current folder. Please check "
"permissions."
<< endl;
cout << "Press Enter to exit..." << endl;
getchar();
return -1;
}
fclose(tempFile);
remove("test.txt");
int result = 0;
cout << "Application build date: " << __DATE__ << " " << __TIME__ << endl << endl;
const LibraryVersion spinnakerLibraryVersion = system->GetLibraryVersion();
cout <<
"Spinnaker library version: " << spinnakerLibraryVersion.
major <<
"." << spinnakerLibraryVersion.
minor
<<
"." << spinnakerLibraryVersion.
type <<
"." << spinnakerLibraryVersion.
build << endl
<< endl;
const unsigned int numCameras = camList.
GetSize();
cout << "Number of cameras detected: " << numCameras << endl << endl;
if (numCameras == 0)
{
system->ReleaseInstance();
cout << "Not enough cameras!" << endl;
cout << "Done! Press Enter to exit..." << endl;
getchar();
return -1;
}
for (unsigned int i = 0; i < numCameras; i++)
{
cout << endl << "Running example for camera " << i << "..." << endl;
cout << "Camera " << i << " example complete..." << endl << endl;
}
system->ReleaseInstance();
cout << endl << "Done! Press Enter to exit..." << endl;
getchar();
return result;
}