Sometimes multiple cameras are connected to the same computer, but it might be necessary to work with a specific camera in the code.
This can be done by providing the serial number of the wanted camera.
The file camera option allows you to experiment with the SDK without access to a physical camera.
The file cameras can be found in Sample Data where there are multiple file cameras to choose from.
Each file camera demonstrates a use case within one of the main applications of the respective camera model.
The example below shows how to create a file camera using the Zivid 2 M70 file camera from Sample Data.
The recommendation is to use Presets available in Zivid Studio and as .yml files (see below).
Presets are designed to work well for most cases right away, making them a great starting point.
If needed, you can easily fine-tune the settings for better results.
You can edit the YAML files in any text editor or code the settings manually.
constautosettingsFile="Settings.yml";std::cout<<"Loading settings from file: "<<settingsFile<<std::endl;constautosettingsFromFile=Zivid::Settings(settingsFile);
std::cout<<"Configuring settings for capture:"<<std::endl;Zivid::Settings2Dsettings2D{Zivid::Settings2D::Sampling::Color::rgb,Zivid::Settings2D::Sampling::Pixel::all,Zivid::Settings2D::Processing::Color::Balance::Blue{1.0},Zivid::Settings2D::Processing::Color::Balance::Green{1.0},Zivid::Settings2D::Processing::Color::Balance::Red{1.0},Zivid::Settings2D::Processing::Color::Gamma{1.0},Zivid::Settings2D::Processing::Color::Experimental::Mode::automatic,};Zivid::Settingssettings{Zivid::Settings::Color{settings2D},Zivid::Settings::Engine::phase,Zivid::Settings::RegionOfInterest::Box::Enabled::yes,Zivid::Settings::RegionOfInterest::Box::PointO{1000,1000,1000},Zivid::Settings::RegionOfInterest::Box::PointA{1000,-1000,1000},Zivid::Settings::RegionOfInterest::Box::PointB{-1000,1000,1000},Zivid::Settings::RegionOfInterest::Box::Extents{-1000,1000},Zivid::Settings::RegionOfInterest::Depth::Enabled::yes,Zivid::Settings::RegionOfInterest::Depth::Range{200,2000},Zivid::Settings::Processing::Filters::Cluster::Removal::Enabled::yes,Zivid::Settings::Processing::Filters::Cluster::Removal::MaxNeighborDistance{10},Zivid::Settings::Processing::Filters::Cluster::Removal::MinArea{100},Zivid::Settings::Processing::Filters::Hole::Repair::Enabled::yes,Zivid::Settings::Processing::Filters::Hole::Repair::HoleSize{0.2},Zivid::Settings::Processing::Filters::Hole::Repair::Strictness{1},Zivid::Settings::Processing::Filters::Noise::Removal::Enabled::yes,Zivid::Settings::Processing::Filters::Noise::Removal::Threshold{7.0},Zivid::Settings::Processing::Filters::Noise::Suppression::Enabled::yes,Zivid::Settings::Processing::Filters::Noise::Repair::Enabled::yes,Zivid::Settings::Processing::Filters::Outlier::Removal::Enabled::yes,Zivid::Settings::Processing::Filters::Outlier::Removal::Threshold{5.0},Zivid::Settings::Processing::Filters::Reflection::Removal::Enabled::yes,Zivid::Settings::Processing::Filters::Reflection::Removal::Mode::global,Zivid::Settings::Processing::Filters::Smoothing::Gaussian::Enabled::yes,Zivid::Settings::Processing::Filters::Smoothing::Gaussian::Sigma{1.5},Zivid::Settings::Processing::Filters::Experimental::ContrastDistortion::Correction::Enabled::yes,Zivid::Settings::Processing::Filters::Experimental::ContrastDistortion::Correction::Strength{0.4},Zivid::Settings::Processing::Filters::Experimental::ContrastDistortion::Removal::Enabled::no,Zivid::Settings::Processing::Filters::Experimental::ContrastDistortion::Removal::Threshold{0.5},Zivid::Settings::Processing::Resampling::Mode::upsample2x2,Zivid::Settings::Diagnostics::Enabled::no,};setSamplingPixel(settings,camera);std::cout<<settings<<std::endl;std::cout<<"Configuring base acquisition with settings same for all HDR acquisition:"<<std::endl;constautobaseAcquisition=Zivid::Settings::Acquisition{};std::cout<<baseAcquisition<<std::endl;constautobaseAquisition2D=Zivid::Settings2D::Acquisition{};std::cout<<"Configuring acquisition settings different for all HDR acquisitions"<<std::endl;autoexposureValues=getExposureValues(camera);conststd::vector<double>aperture=std::get<0>(exposureValues);conststd::vector<double>gain=std::get<1>(exposureValues);conststd::vector<std::chrono::microseconds>exposureTime=std::get<2>(exposureValues);conststd::vector<double>brightness=std::get<3>(exposureValues);for(size_ti=0;i<aperture.size();++i){std::cout<<"Acquisition "<<i+1<<":"<<std::endl;std::cout<<" Exposure Time: "<<exposureTime.at(i).count()<<std::endl;std::cout<<" Aperture: "<<aperture.at(i)<<std::endl;std::cout<<" Gain: "<<gain.at(i)<<std::endl;std::cout<<" Brightness: "<<brightness.at(i)<<std::endl;constautoacquisitionSettings=baseAcquisition.copyWith(Zivid::Settings::Acquisition::Aperture{aperture.at(i)},Zivid::Settings::Acquisition::Gain{gain.at(i)},Zivid::Settings::Acquisition::ExposureTime{exposureTime.at(i)},Zivid::Settings::Acquisition::Brightness{brightness.at(i)});settings.acquisitions().emplaceBack(acquisitionSettings);}constautoacquisitionSettings2D=baseAquisition2D.copyWith(Zivid::Settings2D::Acquisition::Aperture{2.83},Zivid::Settings2D::Acquisition::ExposureTime{microseconds{10000}},Zivid::Settings2D::Acquisition::Brightness{1.8},Zivid::Settings2D::Acquisition::Gain{1.0});settings.color().value().acquisitions().emplaceBack(acquisitionSettings2D);
Console.WriteLine("Configuring settings for capture:");varsettings2D=newZivid.NET.Settings2D(){Sampling={Color=Zivid.NET.Settings2D.SamplingGroup.ColorOption.Rgb,Pixel=Zivid.NET.Settings2D.SamplingGroup.PixelOption.All,},Processing={Color={Balance={Blue=1.0,Green=1.0,Red=1.0,},Gamma=1.0,Experimental={Mode=Zivid.NET.Settings2D.ProcessingGroup.ColorGroup.ExperimentalGroup.ModeOption.Automatic},},},};varsettings=newZivid.NET.Settings(){Engine=Zivid.NET.Settings.EngineOption.Phase,RegionOfInterest={Box={Enabled=true,PointO=newZivid.NET.PointXYZ{x=1000,y=1000,z=1000},PointA=newZivid.NET.PointXYZ{x=1000,y=-1000,z=1000},PointB=newZivid.NET.PointXYZ{x=-1000,y=1000,z=1000},Extents=newZivid.NET.Range<double>(-1000,1000),},Depth={Enabled=true,Range=newZivid.NET.Range<double>(200,2000),},},Processing={Filters={Cluster={Removal={Enabled=true,MaxNeighborDistance=10,MinArea=100}},Hole={Repair={Enabled=true,HoleSize=0.2,Strictness=1},},Noise={Removal={Enabled=true,Threshold=7.0},Suppression={Enabled=true},Repair={Enabled=true},},Outlier={Removal={Enabled=true,Threshold=5.0},},Reflection={Removal={Enabled=true,Mode=ReflectionFilterModeOption.Global},},Smoothing={Gaussian={Enabled=true,Sigma=1.5},},Experimental={ContrastDistortion={Correction={Enabled=true,Strength=0.4},Removal={Enabled=true,Threshold=0.5},},},},Resampling={Mode=Zivid.NET.Settings.ProcessingGroup.ResamplingGroup.ModeOption.Upsample2x2},},Diagnostics={Enabled=false},};settings.Color=settings2D;SetSamplingPixel(refsettings,camera);Console.WriteLine(settings);Console.WriteLine("Configuring base acquisition with settings same for all HDR acquisitions:");varbaseAcquisition=newZivid.NET.Settings.Acquisition{};Console.WriteLine(baseAcquisition);varbaseAcquisition2D=newZivid.NET.Settings2D.Acquisition{};Console.WriteLine("Configuring acquisition settings different for all HDR acquisitions:");Tuple<double[],Duration[],double[],double[]>exposureValues=GetExposureValues(camera);double[]aperture=exposureValues.Item1;Duration[]exposureTime=exposureValues.Item2;double[]gain=exposureValues.Item3;double[]brightness=exposureValues.Item4;for(inti=0;i<aperture.Length;i++){Console.WriteLine("Acquisition {0}:",i+1);Console.WriteLine(" Exposure Time: {0}",exposureTime[i].Microseconds);Console.WriteLine(" Aperture: {0}",aperture[i]);Console.WriteLine(" Gain: {0}",gain[i]);Console.WriteLine(" Brightness: {0}",brightness[i]);varacquisitionSettings=baseAcquisition.CopyWith(s=>{s.Aperture=aperture[i];s.ExposureTime=exposureTime[i];s.Gain=gain[i];s.Brightness=brightness[i];});settings.Acquisitions.Add(acquisitionSettings);}varacquisitionSettings2D=baseAcquisition2D.CopyWith(s=>{s.Aperture=2.83;s.ExposureTime=Duration.FromMicroseconds(1000);s.Gain=1.0;s.Brightness=1.8;});settings.Color.Acquisitions.Add(acquisitionSettings2D);
print("Configuring settings for capture:")settings_2d=zivid.Settings2D()settings_2d.sampling.color=zivid.Settings2D.Sampling.Color.rgbsettings_2d.sampling.pixel=zivid.Settings2D.Sampling.Pixel.allsettings_2d.processing.color.balance.red=1.0settings_2d.processing.color.balance.blue=1.0settings_2d.processing.color.balance.green=1.0settings_2d.processing.color.gamma=1.0settings_2d.processing.color.experimental.mode=zivid.Settings2D.Processing.Color.Experimental.Mode.automaticsettings=zivid.Settings()settings.engine=zivid.Settings.Engine.phasesettings.region_of_interest.box.enabled=Truesettings.region_of_interest.box.point_o=[1000,1000,1000]settings.region_of_interest.box.point_a=[1000,-1000,1000]settings.region_of_interest.box.point_b=[-1000,1000,1000]settings.region_of_interest.box.extents=[-1000,1000]settings.region_of_interest.depth.enabled=Truesettings.region_of_interest.depth.range=[200,2000]settings.processing.filters.cluster.removal.enabled=Truesettings.processing.filters.cluster.removal.max_neighbor_distance=10settings.processing.filters.cluster.removal.min_area=100settings.processing.filters.hole.repair.enabled=Truesettings.processing.filters.hole.repair.hole_size=0.2settings.processing.filters.hole.repair.strictness=1settings.processing.filters.noise.removal.enabled=Truesettings.processing.filters.noise.removal.threshold=7.0settings.processing.filters.noise.suppression.enabled=Truesettings.processing.filters.noise.repair.enabled=Truesettings.processing.filters.outlier.removal.enabled=Truesettings.processing.filters.outlier.removal.threshold=5.0settings.processing.filters.reflection.removal.enabled=Truesettings.processing.filters.reflection.removal.mode=(zivid.Settings.Processing.Filters.Reflection.Removal.Mode.global_)settings.processing.filters.smoothing.gaussian.enabled=Truesettings.processing.filters.smoothing.gaussian.sigma=1.5settings.processing.filters.experimental.contrast_distortion.correction.enabled=Truesettings.processing.filters.experimental.contrast_distortion.correction.strength=0.4settings.processing.filters.experimental.contrast_distortion.removal.enabled=Falsesettings.processing.filters.experimental.contrast_distortion.removal.threshold=0.5settings.processing.resampling.mode=zivid.Settings.Processing.Resampling.Mode.upsample2x2settings.diagnostics.enabled=Falsesettings.color=settings_2d_set_sampling_pixel(settings,camera)print(settings)print("Configuring acquisition settings different for all HDR acquisitions")exposure_values=_get_exposure_values(camera)foraperture,gain,exposure_time,brightnessinexposure_values:settings.acquisitions.append(zivid.Settings.Acquisition(aperture=aperture,exposure_time=exposure_time,brightness=brightness,gain=gain,))settings_2d.acquisitions.append(zivid.Settings2D.Acquisition(aperture=2.83,exposure_time=timedelta(microseconds=10000),brightness=1.8,gain=1.0,))
Now we can capture a 2D and 3D image (point cloud with color).
Whether there is a single acquisition or multiple acquisitions (HDR) is given by the number of acquisitions in settings.
The Zivid::Frame contains the point cloud, the color image, the capture, and the camera information (all of which are stored on the compute device memory).
The Zivid.NET.Frame contains the point cloud, the color image, the capture, and the camera information (all of which are stored on the compute device memory).
The zivid.Frame contains the point cloud, the color image, the capture, and the camera information (all of which are stored on the compute device memory).
In the next code example, the point cloud is exported to the .ply format.
For other exporting options, see Point Cloud for a list of supported formats.
constautoimageFile="ImageRGB.png";std::cout<<"Saving 2D color image (linear RGB color space) to file: "<<imageFile<<std::endl;imageRGBA.save(imageFile);
Operations on camera objects are thread-safe, but other operations like listing cameras and connecting to cameras should be executed in sequence.
Find out more in Multithreading.