This example describes how to program a sequencer for a shape from shading application triggered via software trigger. Shape from shading is a technical solution to extract 3D information out of 2D images recorded at the same position but each with different lighting. The sequencer is set-up to take 4 images in fast succession triggered by one software trigger. The example uses the 4 high-power PWM outputs of the VCXG.I cameras to power 4 flash segments positioned to illuminate the scene from different angles.
If you want to know more about what to do with a sequencer or when to use a shape from shading, please refer to the application notes below and the user guide of VCXG.I cameras.
The camera is set to trigger mode for shape from shading purposes. Four images are then acquired for each incoming trigger signal.
For each acquired image, the camera outputs activate the illumination in one of the quadrants.
Programming the sequencer
// STOP ACQUISITION AND LOAD DEFAULT PARAMETERS
pDevice->GetRemoteNode("AcquisitionStop")->Execute();
pDevice->GetRemoteNode("UserSetSelector")->SetValue("Default");
pDevice->GetRemoteNode("UserSetLoad")->Execute();
// DEFINE EXPOSURE TIME AND ROI FOR THE SEQUENCER
double ExposureTime = 500;
bo_int64 OffsetX = 0
bo_int64 OffsetY = 0
bo_int64 Height = pDevice->GetRemoteNode("Height")->GetIntMax();
bo_int64 Width = pDevice->GetRemoteNode("Width")->GetIntMax();
// SWITCH TO SEQUENCER CONFIG MODE
pDevice->GetRemoteNode("SequencerConfigurationMode")->SetString("On")
// SET 0 (FIRST STEP OF THE SEQUENCE)
// wait for the trigger and acquire the first image
pDevice->GetRemoteNode("SequencerSetSelector")->SetInt(0);
pDevice->GetRemoteNode("SequencerSetLoad")->Execute();
pDevice->GetRemoteNode("SequencerSetNext")->SetInt(1);
pDevice->GetRemoteNode("ExposureTime")->SetInt(ExposureTime);
pDevice->GetRemoteNode("Height")->SetInt(Height);
pDevice->GetRemoteNode("Width")->SetInt(Width);
pDevice->GetRemoteNode("OffsetX")->SetInt(OffsetX);
pDevice->GetRemoteNode("OffsetY")->SetInt(OffsetY);
pDevice->GetRemoteNode("TriggerMode")->SetValue("On");
pDevice->GetRemoteNode("UserOutputValueAll")->SetInt(0);
pDevice->GetRemoteNode("SequencerTriggerActivation")->SetValue("RisingEdge");
pDevice->GetRemoteNode("SequencerTriggerSource")->SetValue("ExposureActive");
pDevice->GetRemoteNode("SequencerSetSave")->Execute();
// SET 1 (SECOND STEP OF THE SEQUENCE)
// while the exposure is active strobe Output1 (lightning 1)
pDevice->GetRemoteNode("SequencerSetSelector")->SetInt(1);
pDevice->GetRemoteNode("SequencerSetLoad")->Execute();
pDevice->GetRemoteNode("SequencerSetNext")->SetInt(2);
pDevice->GetRemoteNode("UserOutputValueAll")->SetInt(1);
pDevice->GetRemoteNode("SequencerTriggerActivation")->SetValue("FallingEdge");
pDevice->GetRemoteNode("SequencerTriggerSource")->SetValue("ExposureActive");
pDevice->GetRemoteNode("SequencerSetSave")->Execute();
// SET 2 (THIRD STEP OF THE SEQUENCE)
// acquire second Image
pDevice->GetRemoteNode("SequencerSetSelector")->SetInt(2);
pDevice->GetRemoteNode("SequencerSetLoad")->Execute();
pDevice->GetRemoteNode("SequencerSetNext")->SetInt(3);
pDevice->GetRemoteNode("ExposureTime")->SetInt(ExposureTime);
pDevice->GetRemoteNode("Height")->SetInt(Height);
pDevice->GetRemoteNode("Width")->SetInt(Width);
pDevice->GetRemoteNode("OffsetX")->SetInt(OffsetX);
pDevice->GetRemoteNode("OffsetY")->SetInt(OffsetY);
pDevice->GetRemoteNode("TriggerMode")->SetValue("Off");
pDevice->GetRemoteNode("UserOutputValueAll")->SetInt(0);
pDevice->GetRemoteNode("SequencerTriggerActivation")->SetValue("RisingEdge");
pDevice->GetRemoteNode("SequencerTriggerSource")->SetValue("ExposureActive");
pDevice->GetRemoteNode("SequencerSetSave")->Execute();
// SET 3 (FOURTH STEP OF THE SEQUENCE)
// while the exposure is active strobe Output2 (lightning 2)
pDevice->GetRemoteNode("SequencerSetSelector")->SetInt(3);
pDevice->GetRemoteNode("SequencerSetLoad")->Execute();
pDevice->GetRemoteNode("SequencerSetNext")->SetInt(4);
pDevice->GetRemoteNode("UserOutputValueAll")->SetInt(2);
pDevice->GetRemoteNode("SequencerTriggerActivation")->SetValue("FallingEdge");
pDevice->GetRemoteNode("SequencerTriggerSource")->SetValue("ExposureActive");
pDevice->GetRemoteNode("SequencerSetSave")->Execute();
// SET 4 (FIFTH STEP OF THE SEQUENCE)
// acquire third Image
pDevice->GetRemoteNode("SequencerSetSelector")->SetInt(4);
pDevice->GetRemoteNode("SequencerSetLoad")->Execute();
pDevice->GetRemoteNode("SequencerSetNext")->SetInt(5);
pDevice->GetRemoteNode("ExposureTime")->SetInt(ExposureTime);
pDevice->GetRemoteNode("Height")->SetInt(Height);
pDevice->GetRemoteNode("Width")->SetInt(Width);
pDevice->GetRemoteNode("OffsetX")->SetInt(OffsetX);
pDevice->GetRemoteNode("OffsetY")->SetInt(OffsetY);
pDevice->GetRemoteNode("TriggerMode")->SetValue("Off");
pDevice->GetRemoteNode("UserOutputValueAll")->SetInt(0);
pDevice->GetRemoteNode("SequencerTriggerActivation")->SetValue("RisingEdge");
pDevice->GetRemoteNode("SequencerTriggerSource")->SetValue("ExposureActive");
pDevice->GetRemoteNode("SequencerSetSave")->Execute();
// SET 5 (SIXTH STEP OF THE SEQUENCE)
// strobe Output3 (lightning 3)
pDevice->GetRemoteNode("SequencerSetSelector")->SetInt(5);
pDevice->GetRemoteNode("SequencerSetLoad")->Execute();
pDevice->GetRemoteNode("SequencerSetNext")->SetInt(6);
pDevice->GetRemoteNode("UserOutputValueAll")->SetInt(4);
pDevice->GetRemoteNode("SequencerTriggerActivation")->SetValue("FallingEdge");
pDevice->GetRemoteNode("SequencerTriggerSource")->SetValue("ExposureActive");
pDevice->GetRemoteNode("SequencerSetSave")->Execute();
// SET 6 (SEVENTH STEP OF THE SEQUENCE)
// acquire 4. image
pDevice->GetRemoteNode("SequencerSetSelector")->SetInt(6);
pDevice->GetRemoteNode("SequencerSetLoad")->Execute();
pDevice->GetRemoteNode("SequencerSetNext")->SetInt(7);
pDevice->GetRemoteNode("ExposureTime")->SetInt(ExposureTime);
pDevice->GetRemoteNode("Height")->SetInt(Height);
pDevice->GetRemoteNode("Width")->SetInt(Width);
pDevice->GetRemoteNode("OffsetX")->SetInt(OffsetX);
pDevice->GetRemoteNode("OffsetY")->SetInt(OffsetY);
pDevice->GetRemoteNode("TriggerMode")->SetValue("Off");
pDevice->GetRemoteNode("UserOutputValueAll")->SetInt(0);
pDevice->GetRemoteNode("SequencerTriggerActivation")->SetValue("RisingEdge");
pDevice->GetRemoteNode("SequencerTriggerSource")->SetValue("ExposureActive");
pDevice->GetRemoteNode("SequencerSetSave")->Execute();
// SET 7 (EIGHTH STEP OF THE SEQUENCE)
// strobe (Output4) lightning 4
pDevice->GetRemoteNode("SequencerSetSelector")->SetInt(7);
pDevice->GetRemoteNode("SequencerSetLoad")->Execute();
pDevice->GetRemoteNode("SequencerSetNext")->SetInt(0);
pDevice->GetRemoteNode("UserOutputValueAll")->SetInt(8);
pDevice->GetRemoteNode("SequencerTriggerActivation")->SetValue("FallingEdge");
pDevice->GetRemoteNode("SequencerTriggerSource")->SetValue("ExposureActive");
pDevice->GetRemoteNode("SequencerSetSave")->Execute();
// set the sequencer to start with the Set0
pDevice->GetRemoteNode("SequencerSetStart")->SetInt(0);
// SEQUENCER CONFIG END
pDevice->GetRemoteNode("SequencerConfigurationMode")->SetString("Off");
// STOP ACQUISITION AND LOAD DEFAULT PARAMETERS
mDevice.RemoteNodeList["AcquisitionStop"].Execute();
mDevice.RemoteNodeList["UserSetSelector"].Value = "Default";
mDevice.RemoteNodeList["UserSetLoad"].Execute();
// DEFINE EXPOSURE TIME AND ROI FOR THE SEQUENCER
double ExposureTime = 500;
long OffsetX = 0;
long OffsetY = 0;
long Height = mDevice.RemoteNodeList["Height"].Max;
long Width = mDevice.RemoteNodeList["Width"].Max;
// SWITCH TO SEQUENCER CONFIG MODE
mDevice.RemoteNodeList["SequencerConfigurationMode"].Value = "On";
// SET 0 (First STEP OF THE SEQUENCE)
// wait for the trigger and acquire the first image
mDevice.RemoteNodeList["SequencerSetSelector"].Value = 0;
mDevice.RemoteNodeList["SequencerSetLoad"].Execute();
mDevice.RemoteNodeList["SequencerSetNext"].Value = 1;
mDevice.RemoteNodeList["ExposureTime"].Value = ExposureTime;
mDevice.RemoteNodeList["OffsetX"].Value = OffsetX;
mDevice.RemoteNodeList["OffsetY"].Value = OffsetY;
mDevice.RemoteNodeList["Height"].Value = Height;
mDevice.RemoteNodeList["Width"].Value = Width;
mDevice.RemoteNodeList["TriggerMode"].Value = "On";
mDevice.RemoteNodeList["UserOutputValueAll"].Value = 0;
mDevice.RemoteNodeList["SequencerTriggerActivation"].Value = "RisingEdge";
mDevice.RemoteNodeList["SequencerTriggerSource"].Value = "ExposureActive";
mDevice.RemoteNodeList["SequencerSetSave"].Execute();
// SET 1 (SECOND STEP OF THE SEQUENCE)
// while the exposure is active strobe Output1 (lightning 1)
mDevice.RemoteNodeList["SequencerSetSelector"].Value = 1;
mDevice.RemoteNodeList["SequencerSetLoad"].Execute();
mDevice.RemoteNodeList["SequencerSetNext"].Value = 2;
mDevice.RemoteNodeList["UserOutputValueAll"].Value = 1;
mDevice.RemoteNodeList["SequencerTriggerActivation"].Value = "FallingEdge";
mDevice.RemoteNodeList["SequencerTriggerSource"].Value = "ExposureActive";
mDevice.RemoteNodeList["SequencerSetSave"].Execute();
// SET 2 (THIRD STEP OF THE SEQUENCE)
// acquire second Image
mDevice.RemoteNodeList["SequencerSetSelector"].Value = 2;
mDevice.RemoteNodeList["SequencerSetLoad"].Execute();
mDevice.RemoteNodeList["SequencerSetNext"].Value = 3;
mDevice.RemoteNodeList["ExposureTime"].Value = ExposureTime;
mDevice.RemoteNodeList["OffsetX"].Value = OffsetX;
mDevice.RemoteNodeList["OffsetY"].Value = OffsetY;
mDevice.RemoteNodeList["Height"].Value = Height;
mDevice.RemoteNodeList["Width"].Value = Width;
mDevice.RemoteNodeList["TriggerMode"].Value = "Off";
mDevice.RemoteNodeList["UserOutputValueAll"].Value = 0;
mDevice.RemoteNodeList["SequencerTriggerActivation"].Value = "RisingEdge";
mDevice.RemoteNodeList["SequencerTriggerSource"].Value = "ExposureActive";
mDevice.RemoteNodeList["SequencerSetSave"].Execute();
// SET 3 (FOURTH STEP OF THE SEQUENCE)
// while the exposure is active strobe Output2 (lightning 2)
mDevice.RemoteNodeList["SequencerSetSelector"].Value = 3;
mDevice.RemoteNodeList["SequencerSetLoad"].Execute();
mDevice.RemoteNodeList["SequencerSetNext"].Value = 4;
mDevice.RemoteNodeList["UserOutputValueAll"].Value = 2;
mDevice.RemoteNodeList["SequencerTriggerActivation"].Value = "FallingEdge";
mDevice.RemoteNodeList["SequencerTriggerSource"].Value = "ExposureActive";
mDevice.RemoteNodeList["SequencerSetSave"].Execute();
// SET 4 (FIFTH STEP OF THE SEQUENCE)
// acquire third Image
mDevice.RemoteNodeList["SequencerSetSelector"].Value = 4;
mDevice.RemoteNodeList["SequencerSetLoad"].Execute();
mDevice.RemoteNodeList["SequencerSetNext"].Value = 5;
mDevice.RemoteNodeList["ExposureTime"].Value = ExposureTime;
mDevice.RemoteNodeList["OffsetX"].Value = OffsetX;
mDevice.RemoteNodeList["OffsetY"].Value = OffsetY;
mDevice.RemoteNodeList["Height"].Value = Height;
mDevice.RemoteNodeList["Width"].Value = Width;
mDevice.RemoteNodeList["TriggerMode"].Value = "Off";
mDevice.RemoteNodeList["UserOutputValueAll"].Value = 0;
mDevice.RemoteNodeList["SequencerTriggerActivation"].Value = "RisingEdge";
mDevice.RemoteNodeList["SequencerTriggerSource"].Value = "ExposureActive";
mDevice.RemoteNodeList["SequencerSetSave"].Execute();
// SET 5 (SIXTH STEP OF THE SEQUENCE)
// strobe Output3 (lightning 3)
mDevice.RemoteNodeList["SequencerSetSelector"].Value = 5;
mDevice.RemoteNodeList["SequencerSetLoad"].Execute();
mDevice.RemoteNodeList["SequencerSetNext"].Value = 6;
mDevice.RemoteNodeList["UserOutputValueAll"].Value = 4;
mDevice.RemoteNodeList["SequencerTriggerActivation"].Value = "FallingEdge";
mDevice.RemoteNodeList["SequencerTriggerSource"].Value = "ExposureActive";
mDevice.RemoteNodeList["SequencerSetSave"].Execute();
// SET 6 (SEVENTH STEP OF THE SEQUENCE)
// acquire 4. image
mDevice.RemoteNodeList["SequencerSetSelector"].Value = 6;
mDevice.RemoteNodeList["SequencerSetLoad"].Execute();
mDevice.RemoteNodeList["SequencerSetNext"].Value = 7;
mDevice.RemoteNodeList["ExposureTime"].Value = ExposureTime;
mDevice.RemoteNodeList["OffsetX"].Value = OffsetX;
mDevice.RemoteNodeList["OffsetY"].Value = OffsetY;
mDevice.RemoteNodeList["Height"].Value = Height;
mDevice.RemoteNodeList["Width"].Value = Width;
mDevice.RemoteNodeList["TriggerMode"].Value = "Off";
mDevice.RemoteNodeList["UserOutputValueAll"].Value = 0;
mDevice.RemoteNodeList["SequencerTriggerActivation"].Value = "RisingEdge";
mDevice.RemoteNodeList["SequencerTriggerSource"].Value = "ExposureActive";
mDevice.RemoteNodeList["SequencerSetSave"].Execute();
// SET 7 (EIGHTH STEP OF THE SEQUENCE)
// strobe (Output4) lightning 4
mDevice.RemoteNodeList["SequencerSetSelector"].Value = 7;
mDevice.RemoteNodeList["SequencerSetLoad"].Execute();
mDevice.RemoteNodeList["SequencerSetNext"].Value = 0;
mDevice.RemoteNodeList["UserOutputValueAll"].Value = 8;
mDevice.RemoteNodeList["SequencerTriggerActivation"].Value = "FallingEdge";
mDevice.RemoteNodeList["SequencerTriggerSource"].Value = "ExposureActive";
mDevice.RemoteNodeList["SequencerSetSave"].Execute();
// set the sequencer to start with the Set0
mDevice.RemoteNodeList["SequencerSetStart"].Value = 0;
// SEQUENCER CONFIG END
mDevice.RemoteNodeList["SequencerConfigurationMode"].Value = "Off";
Now that the sequencer is set-up we also need to configure the PWM Outputs of the camera to drive the lighting for the setup.
// define line outputs parameters
bo_int64 LightningTime = (long)ExposureTime - 2;
bo_int64 MaxDutyCycle = 10;
bo_int64 DutyCycle = 10;
bo_int64 MaxDuration = 1900;
String LineFormat = "OpenSource";
String LinePWMMode = "OnePulse";
// configure Line4 for UserOutput1 as single lightning flash 1
pDevice->GetRemoteNode("LineSelector")->SetValue("Line4");
pDevice->GetRemoteNode("LineFormat")->SetValue(LineFormat);
pDevice->GetRemoteNode("LineInverter")->SetValue("0");
pDevice->GetRemoteNode("LinePWMConfigurationMode")->SetValue("On");
pDevice->GetRemoteNode("LinePWMDuration")->SetInt(1);
pDevice->GetRemoteNode("LinePWMDutyCycle")->SetInt(1);
pDevice->GetRemoteNode("LinePWMMaxDutyCycle")->SetInt(MaxDutyCycle);
pDevice->GetRemoteNode("LinePWMMaxDuration")->SetInt(MaxDuration);
pDevice->GetRemoteNode("LinePWMConfigurationMode")->SetValue("Off");
pDevice->GetRemoteNode("LinePWMDuration")->SetInt(LightningTime);
pDevice->GetRemoteNode("LinePWMDutyCycle")->SetInt(DutyCycle);
pDevice->GetRemoteNode("LinePWMMode")->SetValue(LinePWMMode);
pDevice->GetRemoteNode("LineSource")->SetValue("UserOutput1");
// configure Line5 for UserOutput2 as single lightning flash 2
pDevice->GetRemoteNode("LineSelector")->SetValue("Line5");
pDevice->GetRemoteNode("LineFormat")->SetValue(LineFormat);
pDevice->GetRemoteNode("LineInverter")->SetValue("0");
pDevice->GetRemoteNode("LinePWMConfigurationMode")->SetValue("On");
pDevice->GetRemoteNode("LinePWMDuration")->SetInt(1);
pDevice->GetRemoteNode("LinePWMDutyCycle")->SetInt(1);
pDevice->GetRemoteNode("LinePWMMaxDutyCycle")->SetInt(MaxDutyCycle);
pDevice->GetRemoteNode("LinePWMMaxDuration")->SetInt(MaxDuration);
pDevice->GetRemoteNode("LinePWMConfigurationMode")->SetValue("Off");
pDevice->GetRemoteNode("LinePWMDuration")->SetInt(LightningTime);
pDevice->GetRemoteNode("LinePWMDutyCycle")->SetInt(DutyCycle);
pDevice->GetRemoteNode("LinePWMMode")->SetValue(LinePWMMode);
pDevice->GetRemoteNode("LineSource")->SetValue("UserOutput2");
// configure Line6 for UserOutput3 as single lightning flash 3
pDevice->GetRemoteNode("LineSelector")->SetValue("Line6");
pDevice->GetRemoteNode("LineFormat")->SetValue(LineFormat);
pDevice->GetRemoteNode("LineInverter")->SetValue("0");
pDevice->GetRemoteNode("LinePWMConfigurationMode")->SetValue("On");
pDevice->GetRemoteNode("LinePWMDuration")->SetInt(1);
pDevice->GetRemoteNode("LinePWMDutyCycle")->SetInt(1);
pDevice->GetRemoteNode("LinePWMMaxDutyCycle")->SetInt(MaxDutyCycle);
pDevice->GetRemoteNode("LinePWMMaxDuration")->SetInt(MaxDuration);
pDevice->GetRemoteNode("LinePWMConfigurationMode")->SetValue("Off");
pDevice->GetRemoteNode("LinePWMDuration")->SetInt(LightningTime);
pDevice->GetRemoteNode("LinePWMDutyCycle")->SetInt(DutyCycle);
pDevice->GetRemoteNode("LinePWMMode")->SetValue(LinePWMMode);
pDevice->GetRemoteNode("LineSource")->SetValue("UserOutput3");
// configure Line7 for UserOutput4 as single lightning flash 4
pDevice->GetRemoteNode("LineSelector")->SetValue("Line7");
pDevice->GetRemoteNode("LineFormat")->SetValue(LineFormat);
pDevice->GetRemoteNode("LineInverter")->SetValue("0");
pDevice->GetRemoteNode("LinePWMConfigurationMode")->SetValue("On");
pDevice->GetRemoteNode("LinePWMDuration")->SetInt(1);
pDevice->GetRemoteNode("LinePWMDutyCycle")->SetInt(1);
pDevice->GetRemoteNode("LinePWMMaxDutyCycle")->SetInt(MaxDutyCycle);
pDevice->GetRemoteNode("LinePWMMaxDuration")->SetInt(MaxDuration);
pDevice->GetRemoteNode("LinePWMConfigurationMode")->SetValue("Off");
pDevice->GetRemoteNode("LinePWMDuration")->SetInt(LightningTime);
pDevice->GetRemoteNode("LinePWMDutyCycle")->SetInt(DutyCycle);
pDevice->GetRemoteNode("LinePWMMode")->SetValue(LinePWMMode);
pDevice->GetRemoteNode("LineSource")->SetValue("UserOutput4");
// define line outputs parameters
long LightningTime = (long)ExposureTime - 2;
long MaxDutyCycle = 10;
long DutyCycle = 10;
long MaxDuration = 1900;
string LineFormat = "OpenSource";
string LinePWMMode = "OnePulse";
// configure Line4 for UserOutput1 as single lightning flash 1
mDevice.RemoteNodeList["LineSelector"].Value = "Line4";
mDevice.RemoteNodeList["LineFormat"].Value = LineFormat;
mDevice.RemoteNodeList["LineInverter"].Value = false;
mDevice.RemoteNodeList["LinePWMConfigurationMode"].Value = "On";
mDevice.RemoteNodeList["LinePWMDuration"].Value = 1;
mDevice.RemoteNodeList["LinePWMDutyCycle"].Value = 1;
mDevice.RemoteNodeList["LinePWMMaxDutyCycle"].Value = MaxDutyCycle;
mDevice.RemoteNodeList["LinePWMMaxDuration"].Value = MaxDuration;
mDevice.RemoteNodeList["LinePWMConfigurationMode"].Value = "Off";
mDevice.RemoteNodeList["LinePWMDuration"].Value = LightningTime;
mDevice.RemoteNodeList["LinePWMDutyCycle"].Value = DutyCycle;
mDevice.RemoteNodeList["LinePWMMode"].Value = LinePWMMode;
mDevice.RemoteNodeList["LineSource"].Value = "UserOutput1";
// configure Line5 for UserOutput2 as single lightning flash 2
mDevice.RemoteNodeList["LineSelector"].Value = "Line5";
mDevice.RemoteNodeList["LineFormat"].Value = LineFormat;
mDevice.RemoteNodeList["LineInverter"].Value = false;
mDevice.RemoteNodeList["LinePWMConfigurationMode"].Value = "On";
mDevice.RemoteNodeList["LinePWMDuration"].Value = 1;
mDevice.RemoteNodeList["LinePWMDutyCycle"].Value = 1;
mDevice.RemoteNodeList["LinePWMMaxDutyCycle"].Value = MaxDutyCycle;
mDevice.RemoteNodeList["LinePWMMaxDuration"].Value = MaxDuration;
mDevice.RemoteNodeList["LinePWMConfigurationMode"].Value = "Off";
mDevice.RemoteNodeList["LinePWMDuration"].Value = LightningTime;
mDevice.RemoteNodeList["LinePWMDutyCycle"].Value = DutyCycle;
mDevice.RemoteNodeList["LinePWMMode"].Value = LinePWMMode;
mDevice.RemoteNodeList["LineSource"].Value = "UserOutput2";
// configure Line6 for UserOutput3 as single lightning flash 3
mDevice.RemoteNodeList["LineSelector"].Value = "Line6";
mDevice.RemoteNodeList["LineFormat"].Value = LineFormat;
mDevice.RemoteNodeList["LineInverter"].Value = false;
mDevice.RemoteNodeList["LinePWMConfigurationMode"].Value = "On";
mDevice.RemoteNodeList["LinePWMDuration"].Value = 1;
mDevice.RemoteNodeList["LinePWMDutyCycle"].Value = 1;
mDevice.RemoteNodeList["LinePWMMaxDutyCycle"].Value = MaxDutyCycle;
mDevice.RemoteNodeList["LinePWMMaxDuration"].Value = MaxDuration;
mDevice.RemoteNodeList["LinePWMConfigurationMode"].Value = "Off";
mDevice.RemoteNodeList["LinePWMDuration"].Value = LightningTime;
mDevice.RemoteNodeList["LinePWMDutyCycle"].Value = DutyCycle;
mDevice.RemoteNodeList["LinePWMMode"].Value = LinePWMMode;
mDevice.RemoteNodeList["LineSource"].Value = "UserOutput3";
// configure Line7 for UserOutput4 as single lightning flash 4
mDevice.RemoteNodeList["LineSelector"].Value = "Line7";
mDevice.RemoteNodeList["LineFormat"].Value = LineFormat;
mDevice.RemoteNodeList["LineInverter"].Value = false;
mDevice.RemoteNodeList["LinePWMConfigurationMode"].Value = "On";
mDevice.RemoteNodeList["LinePWMDuration"].Value = 1;
mDevice.RemoteNodeList["LinePWMDutyCycle"].Value = 1;
mDevice.RemoteNodeList["LinePWMMaxDutyCycle"].Value = MaxDutyCycle;
mDevice.RemoteNodeList["LinePWMMaxDuration"].Value = MaxDuration;
mDevice.RemoteNodeList["LinePWMConfigurationMode"].Value = "Off";
mDevice.RemoteNodeList["LinePWMDuration"].Value = LightningTime;
mDevice.RemoteNodeList["LinePWMDutyCycle"].Value = DutyCycle;
mDevice.RemoteNodeList["LinePWMMode"].Value = LinePWMMode;
mDevice.RemoteNodeList["LineSource"].Value = "UserOutput4";
Finally we start the camera sequencer and do a software trigger.
// START CAMERA SEQUENCER
pDevice->GetRemoteNode("SequencerMode")->SetValue("On");
pDevice->GetRemoteNode("TriggerSource")->SetValue("Software");
pDataStream->StartAcquisitionContinuous();
pDevice->GetRemoteNode("AcquisitionStart")->Execute();
pDevice->GetRemoteNode("TriggerSoftware")->Execute();
// CAPTURE 4 IMAGES
// STOP CAMERA SEQUENCER
pDevice->GetRemoteNode("AcquisitionStop")->Execute();
pDataStream->StopAcquisition();
pDevice->GetRemoteNode("SequencerMode")->SetValue("Off");
// START CAMERA SEQUENCER
mDevice.RemoteNodeList["SequencerMode"].Value = "On";
mDevice.RemoteNodeList["TriggerSource"].Value = "Software";
mDataStream.StartAcquisition();
mDevice.RemoteNodeList["AcquisitionStart"].Execute();
mDevice.RemoteNodeList["TriggerSoftware"].Execute();
// CAPTURE 4 IMAGES
// STOP CAMERA SEQUENCER
mDevice.RemoteNodeList["AcquisitionStop"].Execute();
mDataStream.StopAcquisition();
mDevice.RemoteNodeList["SequencerMode"].Value = "Off";
Shape from shading and sequencer