関心領域

関心領域(ROI)は、ユーザーが定義した関心領域外の点を除去することで、キャプチャ時間を短縮できます。ROI は、3D 空間上のボックス、カメラからの z 値の範囲、またはその両方で指定できます。

ROI は、アプリケーションがシーン全体ではなく視野の一部のみを必要とする場合に役立ちます。たとえば、ビン内の部品を検出したい場合、検出アルゴリズムは、シーン全体ではなくビンの 内部 に絞り込まれた検索スペースから恩恵を受けることができます。

../../../_images/roi.png

ボックスとしての ROI

ROI ボックスフィルタリングの利点

ROI ボックスフィルタリングは、以下のいずれかの利点をもたらします。

キャプチャ時間の短縮(点群の品質は同等)

転送、コピー、処理するデータ量が少なくなり、以下のいずれか、または両方で大幅な速度向上が実現します。

  • 性能の低い GPU(Intel/Jetson)

  • 高負荷な点群処理( Omni/Stripe 、5MP 解像度、複数取得 HDR)

点群の品質が向上(キャプチャ時間は同等)

さまざまな設定を使用できます。例:

  • Phase の代わりに Stripe/Omni エンジン

  • Sampling::Pixel による高解像度化

  • HDR での取得回数の追加

より安価な GPU(キャプチャ時間は同等)

処理するデータ量が少ないため、処理速度が遅くても対応でき、例えば以下のような選択肢が使用可能です。

  • 専用の Nvidia の代わりに Intel/Jetson

より安価なネットワークカード(キャプチャ時間は同等)

転送するデータ量が少ないため、ネットワークが飽和状態になることなく、例えば以下のような選択肢が使用可能です。

  • 2.5G/10G の代わりに 1G

  • 10G の代わりに 2.5G

The parameter Settings::RegionOfInterest::Box enables using ROI as a box. Three points define the base plane of the box and two extents define the height:

  • 3 つの点( Box::PointOBox::PointABox::PointB )は、3D のカメラ座標系で指定され、ボックスの基底面を定義します。基底面をフレームにバインドして長方形を完成させるために、4 番目の点が自動的に検出されます。3 つの点は、次の順序で 2 つのベクトルを構成します。

    • 点 O はベクトルの原点です。

    • 点 A は原点から最初のベクトルにまたがります。

    • 点 B は原点から 2 番目のベクトルにまたがります。

  • 2 つのエクステント( Box::Extents )は、ベースフレームをボックス状に押し出します。点 O、点 A、点 B で定義されるベクトル OAOB の外積がエクステントの方向を示します。したがって、負のエクステントは外積とは逆方向に押し出します。

../../../_images/roi_explanation.png

ROI ボックスの図: ボックスの底面を定義するために 3 つの点 (O、A、B) が指定され、長方形を完成させるために 4 番目の点が自動的に選択されます。4 つの点で定義された境界面を上方 (+E2) と下方 (-E1) の両方に押し出し、ボックスを完成させることができます。

注釈

ボックスのベースフレームは、角が垂直な長方形に 制限されません。したがって、底面として平行四辺形を作成し、ボックスとして平行六面体を作成することができます。

Tip

経験則として 3 点を選択する場合は、次の手順を使用します。

  1. 任意のコーナーに点 O を選択します。

  2. 点 B が点 A に対して 反時計回り の位置になるように点 A を選択します。

  3. 点 A に対して反時計回りの位置に点 B を選択します。

このようにして、エクステントはカメラに向かって正の方向になります。

パフォーマンス

ROI ボックスフィルタリングにより、キャプチャ時間を大幅に短縮できます。時間短縮の大部分は、以下の表に示すコンポーネントを 1 つ以上使用した場合の点群処理によるものです。露光時間が短い場合(約 3000 マイクロ秒未満)には、さらにキャプチャ時間の短縮効果が得られます。

時間短縮

GPU

Vision Engine

Sampling::Pixel

HDR

大幅

ローエンドの Intel & Jetson

Omni

フル解像度

取得回数が多いほど時間短縮効果も大きい

中程度

ハイエンドの Intel & Jetson

Stripe

2x2 サブサンプリング

最小

専用の Nvidia

Phase

4x4 サブサンプリング

ROI が小さいほど、キャプチャ時間は短くなります。ピクセル行数が少ない ROI は、ピクセル列数が少ない ROI に比べて、わずかに高速なキャプチャを実現します。

../../../_images/roi_rows_cols.png

ロボットピッキングの例

以下は、低スペックの PC(Intel Iris Xe 統合型ノートPC GPU と 1G ネットワークカード)を使用した、ROI ボックスフィルタリングが有効な高負荷の点群処理の例です。

固定マウントされた Zivid 2+ MR130 カメラを使用して、ロボットが 600 x 400 x 300 mm のビンからアイテムをピッキングしている場面を想像してください。ロボットのクリアランスを確保するため、カメラはビン上部から 1700 mm の距離に設置され、視野は約 1000 x 800 mm となります。この距離にカメラを設置すると、視野の大部分が ROI の範囲外になるため、各辺から約 20〜25% のピクセル列/行をトリミングできます。下の表に示すように、ROI ボックスフィルタリングを使用することで、キャプチャ時間を大幅に短縮できます。

../../../_images/roi_example_bin_picking.png

Zivid 2 - プリセット

取得時間

キャプチャ時間

ROI なし

ROI

ROI なし

ROI

製造業 鏡面

0.64 s

0.64 s

2.1 s

1.0 s

消費財 品質

0.90 s

0.88 s

5.0 s

3.0 s

ロボット誘導 / 組立の例

以下は、低スペックの PC(Nvidia MX 250 ノートPC GPU と 1G ネットワークカード)を使用した高負荷の点群処理の例です。この例では、ROI ボックスフィルタリングが非常に有効です。

ロボット誘導(穴あけ、溶接、接着など)や組立(ペグ挿入など)といったアプリケーションによっては、ROI が撮像距離におけるカメラの視野(FOV)に比べて非常に小さくなる場合があります。このような場合、ROI は点群の点のわずか 5〜10% を占めるに過ぎないため、ROI ボックスフィルタリングを利用することでキャプチャ時間を大幅に短縮できます(下表参照)。

../../../_images/roi_example_robot_guidance.png

Zivid 2 - プリセット

取得時間

キャプチャ時間

ROI なし

ROI

ROI なし

ROI

製造業 鏡面

0.65 s

0.63 s

1.3 s

0.7 s

製造業 細部形状

0.70 s

0.65 s

5.0 s

0.8 s

Apply ROI box as post-processing

The ROI box filter can also be applied as a post-processing step on an already-captured point cloud, using PointCloud::maskByRegionOfInterest() (in-place) or PointCloud::maskedByRegionOfInterest() (returns a new copy). This avoids the need to recapture when the ROI changes. See the ROIBoxViaArucoMarker and ROIBoxViaCheckerboard samples for examples.

Go to source

source

std::cout << "Creating a masked version of the point cloud based on ROI" << std::endl;
const auto roiPointCloud = pointCloud.maskedByRegionOfInterest(roiSettings);

std::cout << "Displaying the ROI-filtered point cloud" << std::endl;
visualizeZividPointCloud(roiPointCloud);
Go to source

source

using (var roiPointCloud = pointCloud.MaskedByRegionOfInterest(roiSettings))
{
    Console.WriteLine("Displaying the ROI-filtered point cloud");
    VisualizeZividPointCloud(roiPointCloud);
}
Go to source

source

roi_point_cloud = point_cloud.masked_by_region_of_interest(roi_settings)
print("Displaying the ROI-filtered point cloud")
display_pointcloud(roi_point_cloud)

This is particularly useful in robot-mounted setups, where a workspace ROI box can be defined once in the robot base frame and applied to every capture regardless of camera viewpoint. The StitchUsingRobotMountedCamera sample demonstrates this by transforming each point cloud to the base frame and then masking it with a fixed workspace ROI box:

Go to source

source

const auto smallWorkspaceRoiBox = Zivid::Settings::RegionOfInterest::Box{
    Zivid::Settings::RegionOfInterest::Box::Enabled::yes,
    Zivid::Settings::RegionOfInterest::Box::PointO{ -150, 300, 50 },
    Zivid::Settings::RegionOfInterest::Box::PointA{ -150, 600, 50 },
    Zivid::Settings::RegionOfInterest::Box::PointB{ 150, 300, 50 },
    Zivid::Settings::RegionOfInterest::Box::Extents{ -75, 40 },
};
    auto pointCloud = frame.pointCloud();
    pointCloud.transform(baseToCameraTransform);
    pointCloud.maskByRegionOfInterest(workspaceRoiBox);
Go to source

source

var smallWorkspaceRoiBox = new Zivid.NET.Settings.RegionOfInterestGroup.BoxGroup
{
    Enabled = true,
    PointO = new Zivid.NET.PointXYZ { x = -150, y = 300, z = 50 },
    PointA = new Zivid.NET.PointXYZ { x = -150, y = 600, z = 50 },
    PointB = new Zivid.NET.PointXYZ { x = 150, y = 300, z = 50 },
};
smallWorkspaceRoiBox.Extents = new Zivid.NET.Range<double>(-75, 40);
    var pointCloud = frame.PointCloud;
    pointCloud.Transform(baseToCameraTransform);
    pointCloud.MaskByRegionOfInterest(workspaceRoiBox);
Go to source

source

small_workspace_roi_box = zivid.Settings.RegionOfInterest.Box(
    enabled=True,
    point_o=[-150, 300, 50],
    point_a=[-150, 600, 50],
    point_b=[150, 300, 50],
    extents=(-75, 40),
)
    point_cloud = frame.point_cloud()
    point_cloud.transform(base_to_camera_transform)
    point_cloud.mask_by_region_of_interest(workspace_roi_box)

深度範囲としての ROI

The parameter Settings::RegionOfInterest::Depth enables to use ROI as a range of z-values from the camera, where points are kept within the following thresholds:

  • 最小深度しきい値 ( RegionOfInterest::Depth::minValue )

  • 最大深度しきい値 ( RegionOfInterest::Depth::maxValue )

これは、シーンの前景または背景に、フィルタリングによって除去したい点がある場合に便利です。z 値はカメラの座標系で指定されるため、カメラに対して垂直方向にフィルタリングが行われます。したがって、カメラをキャプチャ対象の物体に対して垂直に設置した場合に最も効果的です。

../../../_images/roi_depth.png

パフォーマンス

ROI を深度範囲として使用しても、キャプチャ時間は 短縮されません。これは後処理として適用されるため、キャプチャ時間が数ミリ秒増加します。ただし、GPU に直接適用されるため、サードパーティ製の実装よりも高速である可能性があります。

ROI を深度マップとして使用すると、3D キャプチャごとに以下の処理時間が追加されます。

アプリケーションでの ROI の使用に関する詳細なチュートリアルについては Region of Interest Tutorial を参照してください。

バージョン履歴

SDK

変更点

2.18.0

Added PointCloud::maskByRegionOfInterest() / maskedByRegionOfInterest() for applying ROI box as post-processing without recapturing.

2.12.0

ROI ボックスフィルタリングにより、キャプチャ時間を短縮できます。

2.9.0

ROI API が追加されました。