This example covers all of the following: the preparation of a camera to acquire compressed images (or compressed chunk images), image retrieval, image saving, loading compressed images from disk, reconstructing compressed images, and converting compressed images.
#include <iostream>
#include <sstream>
#include <fstream>
using namespace std;
{
string fileName;
size_t compressedImageSize;
size_t imageWidth;
size_t imageHeight;
size_t imageXOffset;
size_t imageYOffset;
const string& fileName,
size_t imageSize,
size_t width,
size_t height,
size_t xOffset,
size_t yOffset,
: fileName(fileName), compressedImageSize(imageSize), imageWidth(width), imageHeight(height),
imageXOffset(xOffset), imageYOffset(yOffset), imagePixelFormat(pixelFormat)
{
}
};
{
INodeMap& nodeMapTLDevice = pCam->GetTLDeviceNodeMap();
{
return -1;
}
{
return 0;
}
if (enableHeartbeat)
{
cout << endl << "Resetting heartbeat..." << endl << endl;
}
else
{
cout << endl << "Disabling heartbeat..." << endl << endl;
}
CBooleanPtr ptrDeviceHeartbeat = nodeMap.GetNode(
"GevGVCPHeartbeatDisable");
{
cout << "Unable to configure heartbeat. Continuing with execution as this may be non-fatal..." << endl << endl;
}
else
{
ptrDeviceHeartbeat->SetValue(!enableHeartbeat);
if (!enableHeartbeat)
{
cout << "WARNING: Heartbeat has been disabled for the rest of this example run." << endl;
cout << " Heartbeat will be reset upon the completion of this run. If the " << endl;
cout << " example is aborted unexpectedly before the heartbeat is reset, the" << endl;
cout << " camera may need to be power cycled to reset the heartbeat." << endl << endl;
}
else
{
cout << "Heartbeat has been reset." << endl;
}
}
return 0;
}
{
}
{
}
vector<CompressedImageInfo>& compressedImageInfos)
{
int result = 0;
cout << endl << endl << "*** IMAGE ACQUISITION ***" << endl << endl;
try
{
{
cout << "Unable to get or set acquisition mode to continuous (enum retrieval). Aborting..." << endl << endl;
return -1;
}
CEnumEntryPtr ptrAcquisitionModeContinuous = ptrAcquisitionMode->GetEntryByName(
"Continuous");
{
cout << "Unable to get acquisition mode to continuous (entry retrieval). Aborting..." << endl << endl;
return -1;
}
const int64_t acquisitionModeContinuous = ptrAcquisitionModeContinuous->GetValue();
ptrAcquisitionMode->SetIntValue(acquisitionModeContinuous);
cout << "Acquisition mode set to continuous..." << endl;
pCam->BeginAcquisition();
cout << "Acquiring images..." << endl;
CStringPtr ptrStringSerial = nodeMapTLDevice.GetNode(
"DeviceSerialNumber");
{
deviceSerialNumber = ptrStringSerial->GetValue();
cout << "Device serial number retrieved as " << deviceSerialNumber << "..." << endl;
}
cout << endl;
for (
unsigned int imageCnt = 0; imageCnt <
k_numImages; imageCnt++)
{
try
{
ImagePtr pResultImage = pCam->GetNextImage(1000);
if (pResultImage->IsIncomplete())
{
<< "..." << endl
<< endl;
}
else
{
const size_t width = pResultImage->GetWidth();
const size_t height = pResultImage->GetHeight();
const bool isCompressed = pResultImage->IsCompressed();
cout << "Grabbed image " << imageCnt << ", width = " << width << ", height = " << height
<< ", IsCompressed = " << (isCompressed ? "true" : "false");
{
ChunkData chunkData = pResultImage->GetChunkData();
const int64_t chunkImageCRC = chunkData.
GetCRC();
cout << ", compression ratio = " << compressionRatio << ", CRC = " << chunkImageCRC;
}
cout << endl;
if (pResultImage->HasCRC())
{
if (!pResultImage->CheckCRC())
{
cout << "WARNING: CRC mismatch could lead to image decompression failures" << endl;
}
}
ostringstream filename;
filename << "Compression-";
if (!deviceSerialNumber.empty())
{
filename << deviceSerialNumber.c_str() << "-";
}
filename << imageCnt;
cout << "Image saved at " << filename.str() << ".raw" << endl;
filename.str(),
pResultImage->GetImageSize(),
width,
height,
pResultImage->GetXOffset(),
pResultImage->GetYOffset(),
pResultImage->GetPixelFormat());
compressedImageInfos.push_back(imageInfo);
}
pResultImage->Release();
cout << endl;
}
{
cout <<
"Error: " << e.
what() << endl;
result = -1;
}
}
pCam->EndAcquisition();
}
{
cout <<
"Error: " << e.
what() << endl;
return -1;
}
return result;
}
{
int result = 0;
cout << endl << "*** DEVICE INFORMATION ***" << endl << endl;
try
{
FeatureList_t features;
CCategoryPtr category = nodeMap.GetNode(
"DeviceInformation");
{
category->GetFeatures(features);
FeatureList_t::const_iterator it;
for (it = features.begin(); it != features.end(); ++it)
{
try
{
cout << pfeatureNode->GetName() << " : ";
cout << (
IsReadable(pValue) ? pValue->ToString() :
"Node not readable");
cout << endl;
}
{
cout << "Node not readable" << endl;
}
}
}
else
{
cout << "Device control information not readable." << endl;
}
}
{
cout <<
"Error: " << e.
what() << endl;
result = -1;
}
return result;
}
{
try
{
cout << endl << "Configuring camera settings to enable image chunk data..." << endl;
bool chunkEnabled = false;
CBooleanPtr ptrChunkModeActive = nodeMap.GetNode(
"ChunkModeActive");
{
ptrChunkModeActive->SetValue(true);
{
CEnumEntryPtr ptrCompressionRatioEntry = ptrChunkSelector->GetEntryByName(
"CompressionRatio");
{
ptrChunkSelector->SetIntValue(ptrCompressionRatioEntry->GetValue());
CBooleanPtr ptrChunkEnable = nodeMap.GetNode(
"ChunkEnable");
{
ptrChunkEnable->SetValue(true);
chunkEnabled = true;
}
}
}
}
cout << "CompressionRatio chunk data " << (chunkEnabled ? "enabled" : "not enabled") << endl;
}
{
cout <<
"Unexpected error while configuring image chunk data: " << e.
what() << endl;
return false;
}
return true;
}
{
try
{
cout << endl << "Disabling image chunk data..." << endl;
{
CEnumEntryPtr ptrCompressionRatioEntry = ptrChunkSelector->GetEntryByName(
"CompressionRatio");
{
ptrChunkSelector->SetIntValue(ptrCompressionRatioEntry->GetValue());
CBooleanPtr ptrChunkEnable = nodeMap.GetNode(
"ChunkEnable");
{
ptrChunkEnable->SetValue(false);
}
}
}
CBooleanPtr ptrChunkModeActive = nodeMap.GetNode(
"ChunkModeActive");
{
ptrChunkModeActive->SetValue(false);
}
cout << "Disabled image chunk data..." << endl;
}
{
cout <<
"Unexpected error while disabling image chunk data: " << e.
what() << endl;
return false;
}
return true;
}
{
try
{
cout << endl << "Configuring camera settings to enable image compression..." << endl;
{
cout << "Unable to get or set pixel format. Aborting..." << endl << endl;
return false;
}
CBooleanPtr ptrIspEnable = nodeMap.GetNode(
"IspEnable");
{
ptrIspEnable->SetValue(false);
cout << "IspEnable set to false..." << endl;
}
CEnumEntryPtr ptrPixelFormatBayerRG8 = ptrPixelFormat->GetEntryByName(
"BayerRG8");
{
CEnumEntryPtr ptrPixelFormatMono8 = ptrPixelFormat->GetEntryByName(
"Mono8");
{
cout << "Unable to get pixel format to BayerRG8 or Mono8. Aborting..." << endl << endl;
return false;
}
ptrPixelFormat->SetIntValue(ptrPixelFormatMono8->GetValue());
cout << "Pixel format set to " << ptrPixelFormatMono8->GetSymbolic() << "..." << endl;
}
else
{
ptrPixelFormat->SetIntValue(ptrPixelFormatBayerRG8->GetValue());
cout << "Pixel format set to " << ptrPixelFormatBayerRG8->GetSymbolic() << "..." << endl;
}
CEnumerationPtr ptrCompressionMode = nodeMap.GetNode(
"ImageCompressionMode");
{
cout << "Unable to set image compression mode to Lossless (enum retrieval). Aborting..." << endl << endl;
return false;
}
CEnumEntryPtr ptrCompressionModeLossless = ptrCompressionMode->GetEntryByName(
"Lossless");
{
cout << "Unable to get image compression mode to Lossless (entry retrieval). Aborting..." << endl << endl;
return false;
}
ptrCompressionMode->SetIntValue(ptrCompressionModeLossless->GetValue());
cout << "Compression mode set to " << ptrCompressionModeLossless->GetSymbolic() << "..." << endl;
cout << endl << "*** COMPRESSION SETTINGS ***" << endl << endl;
cout << "Compression Mode: "
<< (
IsReadable(ptrCompressionMode) ? ptrCompressionMode->ToString() :
"Node not readable") << endl;
CIntegerPtr ptrCompressionBlockSize = nodeMap.GetNode(
"LosslessCompressionBlockSize");
cout << "Compression Block Size: "
<< (
IsReadable(ptrCompressionBlockSize) ? ptrCompressionBlockSize->ToString() :
"Node not readable")
<< endl;
CFloatPtr ptrCompressionRatio = nodeMap.GetNode(
"CompressionRatio");
cout << "Compression Ratio: "
<< (
IsReadable(ptrCompressionRatio) ? ptrCompressionRatio->ToString() :
"Node not readable") << endl;
string compressionSaturationPriority = "Node not readable";
CEnumerationPtr ptrCompressionSaturationPriority = nodeMap.GetNode(
"CompressionSaturationPriority");
{
CEnumEntryPtr ptrCompressionSaturationPriorityEntry = ptrCompressionSaturationPriority->GetCurrentEntry();
if (
IsReadable(ptrCompressionSaturationPriorityEntry))
{
compressionSaturationPriority = ptrCompressionSaturationPriorityEntry->GetSymbolic();
}
}
cout << "Compression Saturation Priority: " << compressionSaturationPriority << endl;
}
{
cout <<
"Unexpected error while configuring image compression: " << e.
what() << endl;
return false;
}
return true;
}
{
try
{
cout << endl << "Disabling image compression..." << endl;
CEnumerationPtr ptrCompressionMode = nodeMap.GetNode(
"ImageCompressionMode");
{
cout << "Unable to set image compression mode to Off (enum retrieval). Aborting..." << endl << endl;
return false;
}
CEnumEntryPtr ptrCompressionModeOff = ptrCompressionMode->GetEntryByName(
"Off");
{
cout << "Unable to get image compression mode to Off (entry retrieval). Aborting..." << endl << endl;
return false;
}
ptrCompressionMode->SetIntValue(ptrCompressionModeOff->GetValue());
cout << "Compression mode set to " << ptrCompressionModeOff->GetSymbolic() << "..." << endl;
}
{
cout <<
"Unexpected error while disabling image compression: " << e.
what() << endl;
return false;
}
return true;
}
{
int result = 0;
const unsigned int kNumDecompressionThreads = 4;
try
{
cout << "Number of decompression threads set to " << kNumDecompressionThreads << endl << endl;
}
{
cout << "Unexpected error when setting the number of decompression threads to " << kNumDecompressionThreads
<< endl;
cout <<
"Error: " << se.
what() << endl;
result = -1;
}
for (auto imageInfo = compressedImageInfos.begin(); imageInfo != compressedImageInfos.end(); ++imageInfo)
{
ifstream file(imageInfo->fileName + ".raw", ios::binary | ios::in);
if (!file)
{
cout << "Failed to load image " << imageInfo->fileName << endl;
result = -1;
continue;
}
cout << "Loading compressed image from '" << imageInfo->fileName << ".raw'" << endl;
std::shared_ptr<char> imageBuffer(new char[imageInfo->compressedImageSize], std::default_delete<char[]>());
file.read(imageBuffer.get(), imageInfo->compressedImageSize);
file.close();
try
{
imageInfo->imageWidth,
imageInfo->imageHeight,
imageInfo->imageXOffset,
imageInfo->imageYOffset,
imageInfo->imagePixelFormat,
imageBuffer.get(),
imageInfo->compressedImageSize);
if (convertedImage->IsIncomplete())
{
cout << "Decompressed / Converted image is incomplete : "
}
cout << "Image saved at " << imageInfo->fileName << ".jpg" << endl << endl;
}
{
cout << "Unexpected error when processing " << imageInfo->fileName << endl;
cout <<
"Error: " << se.
what() << endl;
result = -1;
continue;
}
}
return result;
}
{
int result = 0;
try
{
INodeMap& nodeMapTLDevice = pCam->GetTLDeviceNodeMap();
pCam->Init();
#ifdef _DEBUG
#else
#endif
{
cout << "Failed to enable image chunk data. Please check if image chunk data is supported on this camera"
<< endl;
return -1;
}
{
cout << "Failed to enable image compression. Please check if image compression is supported on this camera"
<< endl;
return -1;
}
vector<CompressedImageInfo> compressedImageInfos;
result = result |
AcquireImages(pCam, nodeMap, nodeMapTLDevice, compressedImageInfos);
{
cout << "Failed to disable image compression." << endl;
result = -1;
}
{
cout << "Failed to disable image chunk data." << endl;
result = -1;
}
#ifdef _DEBUG
#endif
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");
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;
}
int result = 0;
for (unsigned int i = 0; i < numCameras; i++)
{
cout << endl << "Running example for camera " << i << "..." << endl;
cout << "Camera " << i << " example complete..." << endl << endl;
}
pCam = nullptr;
system->ReleaseInstance();
cout << endl << "Done! Press Enter to exit..." << endl;
getchar();
return result;
}