This example touches on the preparation and cleanup of a camera just before and just after the acquisition of images. Image retrieval and conversion, grabbing image data, and saving images are all covered as well. Retrieving node information is the only portion of the example that differs from Acquisition.
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <sstream>
#include <filesystem>
#include "SpinStereoHelper.h"
#include "StereoParameters.h"
#include "Getopt.h"
using namespace std;
{
string executionPath = string(argv[0]);
size_t found = executionPath.find_last_of("/\\");
string programName = executionPath.substr(found + 1);
int iOpt;
const char* currentParamPosition;
bool bBadArgs = false;
if (argc == 1)
{
return true;
}
const char* paramMatchPattern = "n:ABCDEFGh?";
while ((iOpt =
GetOption(argc, argv, paramMatchPattern, ¤tParamPosition)) != 0)
{
switch (iOpt)
{
case 'n':
#ifdef _MSC_VER
if (sscanf_s(currentParamPosition,
"%d", ¶ms.
numImageSets) != 1)
#else
if (sscanf(currentParamPosition,
"%d", ¶ms.
numImageSets) != 1)
#endif
{
bBadArgs = true;
}
else
{
{
cout << "The numImageSets argument must be a number greater than 0." << endl;
bBadArgs = true;
}
}
break;
case 'A':
break;
case 'B':
break;
case 'C':
break;
case 'D':
break;
case 'E':
break;
case 'F':
break;
case 'G':
break;
case '?':
case 'h':
default:
cerr << "Invalid option provided: " << currentParamPosition << endl;
return false;
}
}
if (bBadArgs)
{
cout << "Invalid arguments" << endl;
return false;
}
{
{
cout << "Need to have disparity Image (-E) for point cloud generation" << endl << endl;
return false;
}
{
cout << "Need to have Rectified Sensor1 Image (-C) for point cloud generation" << endl << endl;
return false;
}
}
{
cout << "Need to enable at least one image (-A/-B/-C/-D/-E)" << endl << endl;
return false;
}
return true;
}
{
cout << "Usage: ";
cout << pszProgramName << " [OPTIONS]" << endl << endl;
cout << "OPTIONS" << endl
<< endl
<< " -n NUM_FRAMES Number frames" << endl
<< " -A DO_ENABLE_RAW_SENSOR1_TRANSMIT doEnableRawSensor1Transmit" << endl
<< " -B DO_ENABLE_RAW_SENSOR2_TRANSMIT doEnableRawSensor2Transmit" << endl
<< " -C DO_ENABLE_RECT_SENSOR1_TRANSMIT doEnableRectSensor1Transmit" << endl
<< " -D DO_ENABLE_RECT_SENSOR2_TRANSMIT doEnableRectSensor2Transmit" << endl
<< " -E DO_ENABLE_DISPARITY_TRANSMIT doEnableDisparityTransmit" << endl
<< " -F DO_ENABLE_POINTCLOUD_OUTPUT doEnablePointCloudOutput" << endl
<< " -G DO_ENABLE_SPECKLE_FILTER doEnableSpeckleFilter" << endl
<< "EXAMPLE" << endl
<< endl
<<
" " << pszProgramName <<
" -n " << params.
numImageSets <<
" -A "
<< " -B "
<< " -C "
<< " -D "
<< " -E "
<< " -F " << endl
<< endl;
}
int counter,
string prefix = "")
{
imageList.
GetByPayloadType(SPINNAKER_IMAGE_PAYLOAD_TYPE_DISPARITY_SENSOR1)->GetWidth());
imageList.
GetByPayloadType(SPINNAKER_IMAGE_PAYLOAD_TYPE_DISPARITY_SENSOR1)->GetHeight());
pointCloudParameters,
stereoCameraParameters);
stringstream strstr("");
strstr << prefix;
strstr << "PointCloud_" << counter << ".ply";
cout << "Save point cloud to file: " << strstr.str() << endl;
return true;
}
int counter,
const string prefix = "")
{
cout << "Save images to files." << endl;
stringstream strstr;
{
strstr.str("");
strstr << prefix;
strstr << "RawSensor1_" << counter << ".png";
string rawSensor1Filename = strstr.str();
cout << "Save raw Sensor1 image to file: " << rawSensor1Filename << endl;
imageList.
GetByPayloadType(SPINNAKER_IMAGE_PAYLOAD_TYPE_RAW_SENSOR1)->Save(rawSensor1Filename.c_str());
}
{
strstr.str("");
strstr << prefix;
strstr << "RawSensor2_" << counter << ".png";
string rawSensor2Filename = strstr.str();
cout << "Save raw Sensor2 image to file: " << rawSensor2Filename << endl;
imageList.
GetByPayloadType(SPINNAKER_IMAGE_PAYLOAD_TYPE_RAW_SENSOR2)->Save(rawSensor2Filename.c_str());
}
{
strstr.str("");
strstr << prefix;
strstr << "RectSensor1_" << counter << ".png";
string rectSensor1Filename = strstr.str();
cout << "Save rectified sensor1 image to file: " << rectSensor1Filename << endl;
imageList.
GetByPayloadType(SPINNAKER_IMAGE_PAYLOAD_TYPE_RECTIFIED_SENSOR1)->Save(rectSensor1Filename.c_str());
}
{
strstr.str("");
strstr << prefix;
strstr << "RectSensor2_" << counter << ".png";
string rectSensor2Filename = strstr.str();
cout << "Save rectified sensor2 image to file: " << rectSensor2Filename << endl;
imageList.
GetByPayloadType(SPINNAKER_IMAGE_PAYLOAD_TYPE_RECTIFIED_SENSOR2)->Save(rectSensor2Filename.c_str());
}
{
strstr.str("");
strstr << prefix;
strstr << "Disparity_" << counter << ".pgm";
string disparityFilename = strstr.str();
cout << "Save disparity image to file: " << disparityFilename << endl;
imageList.
GetByPayloadType(SPINNAKER_IMAGE_PAYLOAD_TYPE_DISPARITY_SENSOR1)->Save(disparityFilename.c_str());
}
return true;
}
{
CIntegerPtr ptrPacketSize = nodeMap.GetNode(
"GevSCPSPacketSize");
{
std::cerr << "Failed to get or set the GevSCPSPacketSize parameter from or to the camera." << std::endl;
return false;
}
const unsigned int maxGevSCPSPacketSize = static_cast<unsigned int>(pCam->GevSCPSPacketSize.GetMax());
const unsigned int maxPacketSize =
pCam->DiscoverMaxPacketSize() > maxGevSCPSPacketSize ? maxGevSCPSPacketSize : pCam->DiscoverMaxPacketSize();
pCam->GevSCPSPacketSize.SetValue(maxPacketSize);
cout << "PacketSize set to: " << pCam->GevSCPSPacketSize.GetValue() << endl;
if (!
IsReadable(pCam->DeviceLinkCurrentThroughput))
{
std::cerr << "Failed to get the DeviceLinkCurrentThroughput parameter from the camera." << std::endl;
return false;
}
{
std::cerr << "Failed to get or set the DeviceLinkThroughputLimit parameter from or to the camera." << std::endl;
return false;
}
cout << "Current camera throughput: " << pCam->DeviceLinkCurrentThroughput.GetValue() << endl;
if (pCam->DeviceLinkThroughputLimit.GetMin() > pCam->DeviceLinkCurrentThroughput.GetValue())
{
cout << "DeviceLinkCurrentThroughput node minimum of: " << pCam->DeviceLinkThroughputLimit.GetMin()
<< " is higher than current throughput we desire to set (" << pCam->DeviceLinkCurrentThroughput.GetValue()
<< ")" << endl;
pCam->DeviceLinkThroughputLimit.SetValue(pCam->DeviceLinkThroughputLimit.GetMin());
}
else
{
pCam->DeviceLinkThroughputLimit.SetValue(pCam->DeviceLinkCurrentThroughput.GetValue());
}
cout << "DeviceLinkThroughputLimit set to: " << pCam->DeviceLinkThroughputLimit.GetValue() << endl << endl;
return true;
}
{
bool result = true;
cout << endl << endl << "*** IMAGE ACQUISITION ***" << endl << endl;
try
{
pCam->BeginAcquisition();
cout << endl << "Acquiring " << numImageSets << " image sets." << endl;
gcstring serialNumber = pCam->TLDevice.DeviceSerialNumber.GetValue();
uint64_t timeoutInMilliSecs = 2000;
for (unsigned int counter = 0; counter < numImageSets; counter++)
{
try
{
cout << endl << "Acquiring stereo image set: " << counter << endl;
imageList = pCam->GetNextImageSync(timeoutInMilliSecs);
{
cout << "Failed to get next image set." << endl;
continue;
}
{
{
cout << "Applying SpeckleFilter on disparity image..." << endl;
ImageUtilityStereo::FilterSpecklesFromImage(
pDisparity,
}
else
{
cout << "Skipping disparity post processing as disparity components are disabled" << endl;
}
}
stringstream ss("");
ss << "StereoAcquisition_QuickSpin_" << serialNumber << "_";
{
cerr << "Failed to save images." << endl;
result = false;
break;
}
{
{
{
cerr << "Failed to compute the 3D point cloud." << endl;
result = false;
break;
}
}
else
{
cout << "Skipping compute 3D point cloud as rectified sensor1 or disparity sensor1 components "
"are disabled"
<< endl;
}
}
}
{
cout <<
"Error: " << e.
what() << endl;
result = false;
}
}
pCam->EndAcquisition();
}
{
cout <<
"Error: " << e.
what() << endl;
result = false;
}
return result;
}
{
bool result = true;
try
{
pCam->Init();
cout << endl << "Checking camera stereo support..." << endl;
if (!ImageUtilityStereo::IsStereoCamera(pCam))
{
cout << "Device serial number " << pCam->TLDevice.DeviceSerialNumber.GetValue()
<< " is not a valid BX camera. Skipping..." << endl;
pCam->DeInit();
return true;
}
#ifdef _DEBUG
#else
#endif
if (!result)
{
cerr << "Failed to set the heartbeat." << endl;
pCam->DeInit();
return false;
}
cout << endl << "Configuring camera..." << endl;
{
cerr << "Failed to configure the acquisition." << endl;
pCam->DeInit();
return false;
}
cout << endl << "Configuring device link throughput..." << endl;
{
cerr << "Failed to set the device link trhoughput." << endl;
pCam->DeInit();
return false;
}
cout << endl << "Configuring stereo processing..." << endl;
{
cerr << "Failed to configure stereo processing." << endl;
pCam->DeInit();
return false;
}
cout << endl <<
"*** STEREO PARAMETERS *** " << endl << stereoParameters.
ToString() << endl;
#if _DEBUG
cout << endl << "*** CAMERA CALIBRATION PARAMETERS ***" << endl;
{
cerr << "Failed to get camera calibration parameters." << endl;
return false;
}
#endif
cout << endl << "Acquiring images..." << endl;
#ifdef _DEBUG
#endif
pCam->DeInit();
}
{
cout <<
"Error: " << e.
what() << endl;
result = false;
}
return result;
}
int main(
int argc,
char** argv)
{
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");
string programName = argv[0];
{
return -1;
}
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;
}
bool result = true;
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 == true) ? 0 : -1;
}
int AcquireImages(CameraPtr pCam, INodeMap &nodeMap, INodeMap &nodeMapTLDevice)
Definition Acquisition.cpp:199
int main(int, char **)
Definition Acquisition.cpp:527
int ResetGVCPHeartbeat(CameraPtr pCam)
Definition Acquisition.cpp:138
int RunSingleCamera(CameraPtr pCam)
Definition Acquisition.cpp:479
int PrintDeviceInfo(INodeMap &nodeMap)
Definition Acquisition.cpp:441
int DisableGVCPHeartbeat(CameraPtr pCam)
Definition Acquisition.cpp:143
int GetOption(int argc, char **argv, const char *pszValidOpts, const char **ppszParam)
Definition Getopt.c:96
bool SetDeviceLinkThroughput(CameraPtr pCam)
Definition StereoAcquisition.cpp:352
bool ProcessArgs(int argc, char *argv[], StereoAcquisitionParams ¶ms)
ProcessArgs.
Definition StereoAcquisition.cpp:75
bool Compute3DPointCloudAndSave(const StereoParameters &stereoParameters, ImageList &imageList, int counter, string prefix="")
Compute3DPointCloudAndSave.
Definition StereoAcquisition.cpp:248
void DisplayHelp(const string &pszProgramName, const StereoAcquisitionParams ¶ms)
DisplayHelp.
Definition StereoAcquisition.cpp:201
bool SaveImagesToFile(const StreamTransmitFlags &streamTransmitFlags, ImageList &imageList, int counter, const string prefix="")
Definition StereoAcquisition.cpp:289
Class for handling parameters of the S3D camera.
Definition StereoParameters.h:66
int speckleThreshold
Speckle threshold value.
Definition StereoParameters.h:95
std::string ToString() const
Converts the parameters to a string representation.
Definition StereoParameters.cpp:48
bool doComputePointCloud
flag to enable computation of the 3D point cloud.
Definition StereoParameters.h:86
StreamTransmitFlags streamTransmitFlags
Flags to enable streams image transmission.
Definition StereoParameters.h:84
float scan3dBaseline
Definition StereoParameters.h:100
float scan3dPrincipalPointV
Definition StereoParameters.h:101
float scan3dInvalidDataValue
Definition StereoParameters.h:82
float scan3dPrincipalPointU
Definition StereoParameters.h:102
float scan3dFocalLength
Definition StereoParameters.h:99
float scan3dCoordinateScale
Definition StereoParameters.h:105
bool scan3dInvalidDataFlag
Definition StereoParameters.h:81
bool postProcessDisparity
Flag to enable disparity post-processing.
Definition StereoParameters.h:92
int maxSpeckleSize
Speckle range value.
Definition StereoParameters.h:94
Used to hold a list of camera objects.
Definition CameraList.h:42
void Clear()
Clears the list of cameras and destroys their corresponding reference counted objects.
CameraPtr GetByIndex(unsigned int index) const
Returns a pointer to a camera object at the "index".
unsigned int GetSize() const
Returns the size of the camera list.
A reference tracked pointer to a camera object.
Definition CameraPtr.h:44
The Exception object represents an error that is returned from the library.
Definition Exception.h:51
virtual const char * what() const
virtual override for what().
Encapsulates a GenApi pointer dealing with the dynamic_cast automatically.
Definition Pointer.h:75
Used to hold a list of image objects.
Definition ImageList.h:42
ImagePtr GetByPayloadType(const ImagePayloadType payloadType) const
Returns a pointer to an image object with the specified image payload type.
A reference tracked pointer to an image object.
Definition ImagePtr.h:46
static PointCloud ComputePointCloud(const ImagePtr &disparityImage, const ImagePtr &referenceImage, const PointCloudParameters &pointCloudParameters, const StereoCameraParameters &stereoCameraParameters)
Computes 3D point cloud from disparity and reference images using a stereo matching algorithm.
The PointCloud object class.
Definition PointCloud.h:46
A reference tracked pointer to a system object.
Definition SystemPtr.h:44
bool IsWritable(EAccessMode AccessMode)
Tests if writable.
Definition INode.h:277
bool IsReadable(EAccessMode AccessMode)
Tests if readable.
Definition INode.h:253
interface SPINNAKER_API_ABSTRACT INodeMap
Interface to access the node map.
Definition INodeMap.h:54
void SavePointCloudAsPly(const std::string &) const
The function writes the point cloud data to the specified file in PLY format.
bool PrintCameraCalibrationParams(INodeMap &nodeMap)
Prints the camera calibration parameters.
Definition SpinStereoHelper.cpp:958
Definition SpinStereoHelper.cpp:34
bool ValidateImageList(const StreamTransmitFlags &streamTransmitFlags, ImageList &imageList)
Definition SpinStereoHelper.cpp:763
bool ConfigureAcquisition(CameraPtr pCam, StreamTransmitFlags &streamTransmitFlags)
Definition SpinStereoHelper.cpp:247
bool ConfigureStereoProcessing(INodeMap &nodeMapCamera, StereoParameters &stereoParameters)
Definition SpinStereoHelper.cpp:226
Definition Autovector.h:36
Definition StereoParameters.h:40
bool rawSensor1TransmitEnabled
Flag to enable raw sensor1 image transmission.
Definition StereoParameters.h:41
bool rawSensor2TransmitEnabled
Flag to enable raw sensor2 image transmission.
Definition StereoParameters.h:42
bool rectSensor1TransmitEnabled
Flag to enable rectified sensor1 image transmission.
Definition StereoParameters.h:43
bool disparityTransmitEnabled
Flag to enable disparity image transmission.
Definition StereoParameters.h:45
bool rectSensor2TransmitEnabled
Flag to enable rectified sensor2 image transmission.
Definition StereoParameters.h:44
Provides easier access to the current version of Spinnaker.
Definition SpinnakerDefs.h:657
unsigned int minor
Minor version of the library.
Definition SpinnakerDefs.h:662
unsigned int major
Major version of the library.
Definition SpinnakerDefs.h:659
unsigned int type
Version type of the library.
Definition SpinnakerDefs.h:665
unsigned int build
Build number of the library.
Definition SpinnakerDefs.h:668
Definition SpinnakerDefs.h:741
unsigned int ROIImageTop
Definition SpinnakerDefs.h:751
unsigned int ROIImageLeft
Definition SpinnakerDefs.h:747
unsigned int decimationFactor
Definition SpinnakerDefs.h:744
unsigned int ROIImageBottom
Definition SpinnakerDefs.h:757
unsigned int ROIImageRight
Definition SpinnakerDefs.h:754
Definition SpinnakerDefs.h:798
float invalidDataValue
Definition SpinnakerDefs.h:805
float disparityScaleFactor
Definition SpinnakerDefs.h:804
float principalPointV
Definition SpinnakerDefs.h:803
float focalLength
Definition SpinnakerDefs.h:801
float principalPointU
Definition SpinnakerDefs.h:802
bool invalidDataFlag
Definition SpinnakerDefs.h:806
float baseline
Definition SpinnakerDefs.h:800
Definition StereoAcquisition.h:32
bool doEnableRectSensor2Transmit
Definition StereoAcquisition.h:36
bool doEnableRawSensor1Transmit
Definition StereoAcquisition.h:35
bool doEnableSpeckleFilter
Definition StereoAcquisition.h:40
unsigned int numImageSets
Definition StereoAcquisition.h:33
bool doEnableRawSensor2Transmit
Definition StereoAcquisition.h:34
bool doEnablePointCloudOutput
Definition StereoAcquisition.h:39
bool doEnableDisparityTransmit
Definition StereoAcquisition.h:38
bool doEnableRectSensor1Transmit
Definition StereoAcquisition.h:37