You're viewing an old version of the documentation. Click here to see the latest release.

捕获教程

介绍

本教程介绍了如何使用Zivid SDK捕获点云和2D图像。

对于MATLAB,请查看 Zivid Capture Tutorial for MATLAB

小技巧

如果您更喜欢观看视频教程,我们的网络研讨 会 Making 3D captures easy - A tour of Zivid Studio and Zivid SDK (轻松实现 3D 捕获 - Zivid Studio和Zivid SDK之旅)涵盖的内容与捕获教程相同。

先决条件

初始化

调用Zivid SDK中的任何API都需要初始化Zivid application并在程序运行时使其保持活动状态。

备注

Zivid::Application 必须在操作Zivid相机时保持活动状态。这本质上是Zivid的驱动程序。

Zivid::Application zivid;

连接

现在我们可以连接到相机了。

auto camera = zivid.connectCamera();

选定相机

当多台相机连接到同一台计算机时,如果需要在代码中使用某台特定的相机,可以通过该相机的序列号来实现。

auto camera = zivid.connectCamera(Zivid::CameraInfo::SerialNumber{ "2020C0DE" });

备注

Zivid Studio中显示的相机序列号。

您还可以列出所有连接到计算机的相机,并通过以下方式查看它们的序列号

auto cameras = zivid.cameras();
std::cout << "Found " << cameras.size() << " cameras" << std::endl;
for(auto &camera : cameras)
{
    std::cout << "Camera Info: " << camera.info() << std::endl;
}

档案相机

如果您想在不访问物理相机的情况下测试SDK,那么需要进行细微的更改才能使示例正常工作。

const auto fileCamera = std::string(ZIVID_SAMPLE_DATA_DIR) + "/FileCameraZividOne.zfc";
auto camera = zivid.createFileCamera(fileCamera);

备注

您 从 FileCameraZividOne.zfc 中查看到的点云质量不代表Zivid 3D相机的表现。

配置

与其它所有相机一样,Zivid相机也具备可设置的参数。这些参数可以通过手动设置,或者使用捕获助手进行设置。

捕获助手

如果难以判断如何进行参数设置,可以使用捕获助手来进行配置。Zivid SDK也支持该功能用于帮助配置相机设置。

const auto suggestSettingsParameters = Zivid::CaptureAssistant::SuggestSettingsParameters{
    Zivid::CaptureAssistant::SuggestSettingsParameters::AmbientLightFrequency::none,
    Zivid::CaptureAssistant::SuggestSettingsParameters::MaxCaptureTime{ std::chrono::milliseconds{ 1200 } }
};

std::cout << "Running Capture Assistant with parameters:\n" << suggestSettingsParameters << std::endl;
auto settings = Zivid::CaptureAssistant::suggestSettings(camera, suggestSettingsParameters);

使用Capture Assistant只需配置两个参数:

  1. Maximum Capture Time (最大捕获时间,以毫秒为单位)。

    1. 最小捕获时间为200毫秒。该设置将仅允许一次采集。

    2. 如果时间允许,该算法将合并多次采集。

    3. 该算法将尝试覆盖场景中尽可能多的动态范围。

    4. 在大多数情况下,设置超过1秒的最大捕获时间将获得良好的结果。

  2. Ambient light compensation环境光补偿

    1. 捕获助手将会设置曝光时间为环境光曝光周期的整数倍。

    2. 日本、美洲、台湾、韩国和菲律宾使用60Hz的电网。

    3. 在世界其它地方通常使用50Hz的电网很常见。

手动配置

另一种选择是手动配置设置。关于每个设置项作用的更多信息,请参阅 相机设置。请注意,Zivid Two有一 组 标准设置 供用户使用。

单次采集

我们可以为单次捕获创建设置。

const auto settings =
    Zivid::Settings{ Zivid::Settings::Experimental::Engine::phase,
                     Zivid::Settings::Acquisitions{ Zivid::Settings::Acquisition{
                         Zivid::Settings::Acquisition::Aperture{ 5.66 },
                         Zivid::Settings::Acquisition::ExposureTime{ std::chrono::microseconds{ 6500 } } } },
                     Zivid::Settings::Processing::Filters::Outlier::Removal::Enabled::yes,
                     Zivid::Settings::Processing::Filters::Outlier::Removal::Threshold{ 5.0 } };

多次采集HDR

我们还可以创建用于HDR捕获的设置。

Zivid::Settings settings;
for(const auto aperture : { 11.31, 5.66, 2.83 })
{
    std::cout << "Adding acquisition with aperture = " << aperture << std::endl;
    const auto acquisitionSettings = Zivid::Settings::Acquisition{
        Zivid::Settings::Acquisition::Aperture{ aperture },
    };
    settings.acquisitions().emplaceBack(acquisitionSettings);
}

下面展示了完整的配置设置。

std::cout << "Configuring processing settings for capture:" << std::endl;
Zivid::Settings settings{
    Zivid::Settings::Experimental::Engine::phase,
    Zivid::Settings::Processing::Filters::Smoothing::Gaussian::Enabled::yes,
    Zivid::Settings::Processing::Filters::Smoothing::Gaussian::Sigma{ 1.5 },
    Zivid::Settings::Processing::Filters::Noise::Removal::Enabled::yes,
    Zivid::Settings::Processing::Filters::Noise::Removal::Threshold{ 7.0 },
    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::Experimental::Mode::global,
    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::Color::Balance::Red{ 1.0 },
    Zivid::Settings::Processing::Color::Balance::Green{ 1.0 },
    Zivid::Settings::Processing::Color::Balance::Blue{ 1.0 },
    Zivid::Settings::Processing::Color::Gamma{ 1.0 },
    Zivid::Settings::Processing::Color::Experimental::Mode::automatic
};
std::cout << settings.processing() << std::endl;

std::cout << "Configuring base acquisition with settings same for all HDR acquisition:" << std::endl;
const auto baseAcquisition = Zivid::Settings::Acquisition{ Zivid::Settings::Acquisition::Brightness{ 1.8 } };
std::cout << baseAcquisition << std::endl;

std::cout << "Configuring acquisition settings different for all HDR acquisitions" << std::endl;
auto exposureValues = getExposureValues(camera);
const std::vector<double> aperture = std::get<0>(exposureValues);
const std::vector<double> gain = std::get<1>(exposureValues);
const std::vector<size_t> exposureTime = std::get<2>(exposureValues);
for(size_t i = 0; i < aperture.size(); ++i)
{
    std::cout << "Acquisition " << i + 1 << ":" << std::endl;
    std::cout << "  Exposure Time: " << exposureTime.at(i) << std::endl;
    std::cout << "  Aperture: " << aperture.at(i) << std::endl;
    std::cout << "  Gain: " << gain.at(i) << std::endl;
    const auto acquisitionSettings = baseAcquisition.copyWith(
        Zivid::Settings::Acquisition::Aperture{ aperture.at(i) },
        Zivid::Settings::Acquisition::Gain{ gain.at(i) },
        Zivid::Settings::Acquisition::ExposureTime{ std::chrono::microseconds{ exposureTime.at(i) } });
    settings.acquisitions().emplaceBack(acquisitionSettings);
}

2D设置

您还可以仅捕获2D图像,这比3D捕获要快。 2D设置如下所示。

const auto settings2D =
    Zivid::Settings2D{ Zivid::Settings2D::Acquisitions{ Zivid::Settings2D::Acquisition{
                           Zivid::Settings2D::Acquisition::ExposureTime{ std::chrono::microseconds{ 30000 } },
                           Zivid::Settings2D::Acquisition::Aperture{ 11.31 },
                           Zivid::Settings2D::Acquisition::Brightness{ 1.80 },
                           Zivid::Settings2D::Acquisition::Gain{ 2.0 } } },
                       Zivid::Settings2D::Processing::Color::Balance::Red{ 1 },
                       Zivid::Settings2D::Processing::Color::Balance::Green{ 1 },
                       Zivid::Settings2D::Processing::Color::Balance::Blue{ 1 } };

加载

Zivid Studio can store the current settings to .yml files. These can be read and applied in the API. You may find it easier to modify the settings in these (human-readable) yaml-files in your preferred editor.

const auto settingsFile = "Settings.yml";
std::cout << "Loading settings from file: " << settingsFile << std::endl;
const auto settingsFromFile = Zivid::Settings(settingsFile);

保存

You can also save settings to .yml file.

const auto settingsFile = "Settings.yml";
std::cout << "Saving settings to file: " << settingsFile << std::endl;
settings.save(settingsFile);

小心

Zivid settings files must use .yml file extension ( not .yaml).

捕获

现在我们可以捕获3D图像了。进行单次采集还是多次采集 (HDR) 由 settings 中的 acquisitions 的数量决定。

const auto frame = camera.capture(settings);

Zivid::Frame 包含了点云和彩色图像(存储在计算设备内存中)以及捕获和相机的信息。

加载

保存后,可以从 ZDF 文件加载图像帧。

const auto dataFile = std::string(ZIVID_SAMPLE_DATA_DIR) + "/Zivid3D.zdf";
std::cout << "Reading ZDF frame from file: " << dataFile << std::endl;
const auto frame = Zivid::Frame(dataFile);

本教程稍后会说明如何保存到ZDF文件。

捕获2D图像

如果我们只想捕获2D图像(比3D捕获更快),则可以通过2D API来实现。

const auto frame2D = camera.capture(settings2D);

小心

如果2D捕获设置使用的Brightness(亮度)>0,那么Zivid One+相机在切换捕获模式(2D和3D)时会有时间损失。您可以查看 2D和3D切换的限制 了解更多信息。

保存

我们现在可以保存结果了。

const auto dataFile = "Frame.zdf";
frame.save(dataFile);

小技巧

您可以在 Zivid Studio 中打开并查看 Frame.zdf 文件。

导出

The API detects which format to use. See Point Cloud for a list of supported formats. For example, we can export the point cloud to .ply format.

const auto dataFilePLY = "PointCloud.ply";
frame.save(dataFilePLY);

保存2D图像

我们可以从3D捕获中获得2D彩色图像。

const auto image = frame.pointCloud().copyImageRGBA();

通过单独的2D捕获也能获得2D彩色图像。

const auto image = frame2D.imageRGBA();

然后我们就可以保存2D图像了。

const auto imageFile = "Image.png";
std::cout << "Saving 2D color image to file: " << imageFile << std::endl;
image.save(imageFile);

结论

本教程展示了如何使用Zivid SDK进行相机的连接、配置、捕获和保存文件。