カメラ内部パラメータ

Zivid のカメラモデルは、OpenCV カメラモデルなど、よく知られているピンホールカメラモデルよりも複雑で、より多くの内部パラメータを使用しています。さらに、当社のカメラはローリングキャリブレーションを採用しており、点群は温度、カラーチャンネル、および絞り(調整可能な絞りをサポートするカメラの場合)の関数として生成されます。

Zivid カメラにおける 3D-2D マッピング

すべてのカメラには、空間内の 3D 点とそれに対応する 2D ピクセルインデックスとの間に物理的な関係があります。Zivid カメラの場合:

  • 同一解像度: 2D データと 3D データの解像度が同じ場合、両者の間には直接的な 1:1 のマッピングが存在します。

  • 異なる解像度: 2D 解像度と 3D 解像度が異なる場合、マッピングは次の設定に依存します。

    • Settings2D::Sampling::Pixel

    • Settings::Sampling::Pixel

To maintain a 1:1 correspondence between 2D and 3D data, you can resample the 3D point cloud using Settings::Processing::Resampling setting. For more information, see リサンプリング.

あるいは、リサンプリングが実行されない場合は、 pixelMapping(camera, settings) 関数を使用して、2D と 3D の設定の任意の組み合わせに対して正しいポイントからピクセルへのマッピングを取得できます。

注意

以下の理由から、カメラの内部パラメータを使用することはお勧めしません。

  • 情報の損失:近似は貴重な情報の損失につながる可能性があります。

  • より良い代替手段:多くの場合、同様またはそれ以上の結果を達成するための、より効果的な方法が利用可能です。

内部パラメータの代わりに、点群データを直接使用し ピクセルマッピング を使用することをお勧めします。

Zivid のカメラモデルは独自仕様であるため、 SDK にはカメラ内部のイントリンシックパラメータは含まれていません。しかし、多くのマシンビジョンアルゴリズムは標準モデルに依存しているため、Zivid は互換性のために OpenCV および Halcon のイントリンシックパラメータモデルの近似値を提供しています。

OpenCV カメラ内部パラメータ

Zivid SDK は、OpenCV カメラ内部パラメータを取得するためのいくつかのオプションを提供します。

関数名

返された内部パラメータが対応する解像度

intrinsics(camera)

Default value of Settings::Sampling::Pixel for the camera

intrinsics(camera, settings)

Combination of Settings::Sampling::Pixel and Settings::Resampling in settings

intrinsics(camera, settings_2d)

settings_2d 内の Zivid::Settings2D::Sampling::Pixel の値

estimateIntrinsics(frame)

Combination of Settings::Sampling::Pixel and Settings::Resampling used to capture the frame

最も正確な結果を得るには、点群から内部パラメータを推定することをお勧めします。ハードコードされたカメラ内部パラメータは、単一の絞り値と単一の温度に対して与えられています。そのため、推定された内部パラメータほど正確ではありません。各カメラモデルの値については、以下のリストを参照してください。

カメラモデル

レンズ温度 (°C)

絞り

Zivid 3

35

3.0(固定)

Zivid 2+

35

2.68

Zivid 2

35

2.30

カメラの内部パラメータは、キャプチャ時に使用された温度と絞り値を考慮して、点群から推定されます。

推定された OpenCV 内部パラメータを取得するには、まずカメラに接続する必要があります。

ソースに移動

source

std::cout << "Connecting to camera" << std::endl;
auto camera = zivid.connectCamera();
ソースに移動

ソース

Console.WriteLine("Connecting to camera");
var camera = zivid.ConnectCamera();
ソースに移動

ソース

print("Connecting to camera")
camera = app.connect_camera()

フレームを取得するには、キャプチャ関数を呼び出します。

ソースに移動

ソース

const auto frame = camera.capture2D3D(settings);
ソースに移動

source

using (var frame = camera.Capture2D3D(settings))
{
ソースに移動

source

frame = camera.capture_2d_3d(settings=settings)

次に、フレームから内部パラメータを推定できます。

ソースに移動

source

const auto estimated_intrinsics = Zivid::Experimental::Calibration::estimateIntrinsics(frame);
ソースに移動

source

var estimatedIntrinsics = Zivid.NET.Experimental.Calibration.Calibrator.EstimateIntrinsics(frame);
ソースに移動

source

estimated_intrinsics = zivid.experimental.calibration.estimate_intrinsics(frame)

The estimate intrinsics function takes sampling strategies into account. For example, if you set Settings::Sampling::Pixel to by2x2 and Settings::Resampling to disabled, you get correct (subsampled) intrinsics:

ソースに移動

source

const auto settingsSubsampled = subsampledSettingsForCamera(camera);
const auto frame = camera.capture2D3D(settingsSubsampled);
const auto estimatedIntrinsicsForSubsampledSettings =
    Zivid::Experimental::Calibration::estimateIntrinsics(frame);
ソースに移動

source

var settingsSubsampled = SubsampledSettingsForCamera(camera);
using (var frameSubsampled = camera.Capture2D3D(settingsSubsampled))
{
    var estimatedIntrinsicsForSubsampledSettings = Zivid.NET.Experimental.Calibration.Calibrator.EstimateIntrinsics(frameSubsampled);
ソースに移動

source

settings_subsampled = _subsampled_settings_for_camera(camera)
frame = camera.capture_2d_3d(settings_subsampled)
estimated_intrinsics_for_subsampled_settings = zivid.experimental.calibration.estimate_intrinsics(frame)

単一の絞り値と温度に対して、ハードコードされた内部パラメータが与えられます。ハードコードされたカメラの内部パラメータを取得するには、まずカメラに接続します。

ソースに移動

source

std::cout << "Connecting to camera" << std::endl;
auto camera = zivid.connectCamera();
ソースに移動

ソース

Console.WriteLine("Connecting to camera");
var camera = zivid.ConnectCamera();
ソースに移動

ソース

print("Connecting to camera")
camera = app.connect_camera()

次に、OpenCV のデフォルトのカメラ内部パラメータを取得できます。

ソースに移動

source

std::cout << "Getting camera intrinsics" << std::endl;
const auto intrinsics = Zivid::Experimental::Calibration::intrinsics(camera);
ソースに移動

source

Console.WriteLine("Getting camera intrinsics");
var intrinsics = Zivid.NET.Experimental.Calibration.Calibrator.Intrinsics(camera);
ソースに移動

source

print("Getting camera intrinsics")
intrinsics = zivid.experimental.calibration.intrinsics(camera)

If you are sampling, you can get the OpenCV camera intrinsics corresponding to the combination of Settings::Sampling::Pixel and Settings::Resampling used in settings:

ソースに移動

source

const auto settingsSubsampled = subsampledSettingsForCamera(camera);
const auto fixedIntrinsicsForSubsampledSettings =
    Zivid::Experimental::Calibration::intrinsics(camera, settingsSubsampled);
ソースに移動

source

var settingsSubsampled = SubsampledSettingsForCamera(camera);
var fixedIntrinsicsForSubsampledSettings = Zivid.NET.Experimental.Calibration.Calibrator.Intrinsics(camera, settingsSubsampled);
ソースに移動

source

settings_subsampled = _subsampled_settings_for_camera(camera)
fixed_intrinsics_for_subsampled_settings = zivid.experimental.calibration.intrinsics(camera, settings_subsampled)

2D 設定用のハードコードされた内部パラメータについては、以下を参照してください。

ソースに移動

source

const auto settings2D =
    Zivid::Settings2D{ Zivid::Settings2D::Acquisitions{ Zivid::Settings2D::Acquisition{} } };
const auto fixedIntrinsicsForSettings2D = Zivid::Experimental::Calibration::intrinsics(camera, settings2D);
ソースに移動

source

var settings2D = new Zivid.NET.Settings2D
{
    Acquisitions = { new Zivid.NET.Settings2D.Acquisition { } }
};
var fixedIntrinsicsForSettings2D = Zivid.NET.Experimental.Calibration.Calibrator.Intrinsics(camera, settings2D);
ソースに移動

source

settings_2d = zivid.Settings2D()
settings_2d.acquisitions.append(zivid.Settings2D.Acquisition())
fixed_intrinsics_for_settings_2d = zivid.experimental.calibration.intrinsics(camera, settings_2d)

注意

OpenCV のハードコードされた内部パラメータは固定されており、 estimateIntrinsics とは異なり、温度や絞りの変化に適応しません。そのため、異なる条件下で撮影されたキャプチャと一致しない場合があります。

周囲温度の変化はカメラ内部の温度に影響を与えます。熱安定化機能は役立ちますが、レンズ温度は展開開始時と安定化後では大きく異なる場合があります。この温度差により、ハードコードされた内部パラメータと点群データとの間に不一致が生じる可能性があります。絞り値の変動、特に各取得で異なる絞り値を使用する HDR モードでは、ハードコードされた内部パラメータの精度がさらに複雑になります。これは Zivid 2+ および Zivid 2 カメラにのみ当てはまり、Zivid 3 は絞り値が固定されています。

これらの複雑さを考慮すると、より正確な結果を得るためには、点群からカメラの内部パラメータを推定することをお勧めします。

カメラ内部パラメータの保存

以下のコードを使用すると、OpenCV カメラの内部パラメータを YML ファイルに保存できます。

ソースに移動

source

const auto outputFile = "Intrinsics.yml";
std::cout << "Saving camera intrinsics to file: " << outputFile << std::endl;
intrinsics.save(outputFile);
ソースに移動

source

var intrinsicsFile = "Intrinsics.yml";
Console.WriteLine("Saving camera intrinsics to file: " + intrinsicsFile);
intrinsics.Save(intrinsicsFile);
ソースに移動

source

output_file = "Intrinsics.yml"
print(f"Saving camera intrinsics to file: {output_file}")
intrinsics.save(output_file)

Halcon カメラ内部パラメータ

Halcon は、Zivid および OpenCV カメラモデルとは異なるカメラモデルを使用します。Halcon 内部パラメータを取得するには 2 つのオプションがあり、どちらも OpenCV モデルからの近似に基づいています。

注意

Halcon の内部パラメータ(カメラの内部パラメーター)を使用する必要がある場合は、以下のいずれかの方法で取得してください。Halcon の内部パラメータを取得するために、Halcon で 2D カメラをキャリブレーションしないでください。当社のカメラではうまく動作しません。

要件:

  • Python がインストールされており、Python スクリプトを実行するスキル

  • Zivid-Python がインストールされている

カメラの Halcon 内部パラメータを取得する最も簡単な方法は、 convert_intrinsics_opencv_to_halcon.py コードサンプルを実行することです。カメラから読み込む場合の例 を中心にサンプルの説明をお読みください。

注釈

この方法は、ハードコードされたカメラ内部パラメータの取得に限定されます。

要件:

  • Python がインストールされており、Python スクリプトを実行するスキル

  • C++ または C# コードサンプルをビルドするスキル

カメラの Halcon 内部パラメータを取得するもう 1 つの方法は、OpenCV カメラ内部パラメータを YML ファイルからロードし、Halcon 形式に変換することです。

OpenCV カメラ内部パラメータを取得してファイルに保存するには、次のサンプルのいずれかを実行します。

OpenCV カメラ内部パラメータを取得してファイルに保存するには、 GetCameraIntrinsics.cpp を実行してください。 CMake を使用して C++ サンプルを構成し、Windows の Visual Studio でビルドする を参照してください。

OpenCV カメラ内部パラメータを取得してファイルに保存するには、 GetCameraIntrinsics.cs を実行します。C# サンプルのビルドについては Visual Studio を使用して C# サンプルをビルドする を参照してください。

OpenCV カメラ内部パラメータを取得してファイルに保存するには、 get_camera_intrinsics.py を実行します。

次に、 convert_intrinsics_opencv_to_halcon.py コードサンプルを実行します。ファイルから読み取る場合の例を中心に、サンプルの説明をお読みください。

注釈

この方法では、ハードコードされたカメラ内部パラメータと点群から推定されたカメラ内部パラメータの両方を取得できます。ただし、後者の場合、内部パラメータが必要な各キャプチャについてファイルへの保存とファイルからのロードを行うことが前提となります。

要件:

  • Python がインストールされており、Python スクリプトを実行するスキル

  • Zivid-Python がインストールされている

カメラの Halcon 内部パラメータの推定値を取得する最も簡単な方法は、 convert_intrinsics_opencv_to_halcon.py コードサンプルを実行することです。サンプルの説明をよく読み、特に「ZDF ファイルから読み込む場合の例」に注目してください。

注釈

この方法は、カメラの内部パラメータの推定値を取得することに限定されます。

どのカメラ内部パラメータを使用すればよいですか?

一般的には、内部パラメータではなく、実際の点群データと pixelMapping(camera, settings) 関数を使用することをお勧めします。どうしても必要な場合は、適切なカメラ内部パラメータを選択するための以下のガイドラインを参照してください。

ハードコードされたカメラ内部パラメータ

カメラの内部パラメータをハードコードすることは、以下のシナリオでのみ推奨します。

  • 以下のいずれかのケース:

    • capture2D() を使用して、単一の 2D 取得からカラー画像を取得します。

    • capture2D() を使用して単一の 2D 取得からカラー画像を取得し、 capture3D() を使用して単一の 3D 取得から点群を取得します。

    • capture2D3D() を使用して、単一の 2D 取得からカラー画像を取得し、単一の 3D 取得から点群を取得します。

  • ハードコードされたものと同様の絞り(2D と 3D の両方で使用)については、 を参照してください(これは Zivid 3 の絞りが固定されているため、Zivid 2+ および Zivid 2 カメラにのみ適用されます)。

  • 室温 に近い温度向け。

  • 2D データのみを使用するアプリケーション(例:画像の歪みを解消して直線を検出するなど)の場合。

点群から推定されたカメラ内部パラメータ

ほぼあらゆる状況において、推定された内部パラメータを使用することをお勧めします。

  • カラー画像と点群をどのように取得したかに関わらず、これは点群が、ハードコードされた内部パラメータに対応するものとは異なる絞り値と温度で取得された結果である可能性が高いからです。

  • OpenCV の内部パラメータを使用する必要があるあらゆるユースケース。例えば、次のとおりです。

    • projectPoints() を使用して 3D データを 2D 画像に投影します。

    • solvePnP() を使用して 2D 画像から 3D ポーズを推定します。

注釈

推定されたカメラ内部パラメータは、ハードコードされたカメラ内部パラメータの使用を推奨するすべてのケースにおいても良好に機能します。ただし、内部パラメータの推定には計算時間が必要ですが、カメラからハードコードされた内部パラメータを取得するのは瞬時です。

異なる解像度での 2D および 3D キャプチャ

2D から 3D への変換には、 ピクセルマッピング と点群データを使用することをお勧めします。これにより、解像度の違いが正しく処理されます。

別の方法として、2D 画像をダウンサンプリングまたはサブサンプリングして 3D 解像度に合わせることで、2D データの解像度を 3D データに一致させる方法があります。詳細については サンプリング(3D)サンプリング(2D) 、および リサンプリング を参照してください。

それでも内部パラメータを使用する必要がある場合は、 estimateIntrinsics(frame) を使用することをお勧めします。

ハンドアイキャリブレーション

Zivid カメラに最適なため、弊社独自の ハンドアイキャリブレーション キャリブレーションをお勧めします。弊社のハンドアイキャリブレーション方法はカメラの内部パラメータを必要としませんが、他の多くの方法では必要とします。他の方法を使用する場合は、点群から estimateIntrinsics() を使用することをお勧めします。適切なハンドアイキャリブレーション方法の選択については choosing the correct Hand-Eye calibration method を参照してください。

3D ポイントを 2D 画像平面に投影する

Zivid の点群を 2D 画像平面に投影する場合は estimateIntrinsics を使用することをお勧めします。

これにより、ハードコードされた内部パラメータを使用する場合よりも再投影誤差が小さくなります。ただし、 ガウス平滑化Contrast Distortion Filter などの補正フィルタを使用すると、再投影誤差が増加することに注意してください。補正フィルタを使用せずに取得した点群に推定内部パラメータを使用する場合、再投影誤差は 1 ピクセル未満になると予想されます。補正フィルタを使用する場合、大幅に補正された点では再投影誤差が大きくなります。ただし、ほとんどの点では、再投影誤差は 1 ピクセル未満になるはずです。

ダウンサンプリングまたはサブサンプリングされた 2D

2D データをサブサンプリング/ダウンサンプリングすると、2D と 3D の間の直接的な 1 対 1 のマッピングを回復できます。 サンプリング(3D) を参照してください。

高解像度の 2D 画像をダウンサンプリングする場合、ダウンサンプリングされたピクセルを生成するためにどのピクセルが使用されるかを理解することが重要です。目的のピクセルの周囲に左右対称に配置されたピクセルを使用する場合、平均化されたピクセルは 3D データに対応するピクセル位置に配置されるはずです。これは、 SDK が提供する内部パラメータと最もよく一致します。

詳細については、以下をご覧ください。

2D 画像から 3D 姿勢を推定する

2D ピクセルを 3D 空間に投影する場合、点群から estimateIntrinsics を使用することをお勧めします。

ハードコードされたカメラ内部パラメータと比較すると、点群から推定された内部パラメータの方がより良い結果が得られます。ただし、より正確な結果を得るためには、点群から直接姿勢を推定することをお勧めします。

2D 画像処理アルゴリズム

アプリケーションに 2D データのみを使用する場合は、ハードコードされた内部パラメータと点群から推定された内部パラメータが正常に機能します。例としては、2D 画像の歪みを解消してレンズの歪みを補正し、直線の検出を保証することが挙げられます。

バージョン履歴

SDK

変更点

2.17.0

Zivid 3 XL250 のサポートを追加しました。

2.10.0

モノクロキャプチャ を使用する前に、内部パラメータの変更が必要です。