Camera Intrinsics

Zivid는 이를 필요로 하는 알고리즘을 위해 OpenCV 및 Halcon과 호환되는 카메라 Intrinsics의 근사값을 제공하지만, Intrinsics은 정보 손실이 있는 근사치이므로 대신 포인트 클라우드 데이터와 픽셀 매핑을 직접 사용하는 것을 권장합니다. Zivid 카메라 모델은 일부 잘 알려진 핀홀 카메라 모델(예: OpenCV 카메라 모델)보다 더 복잡하고 더 많은 Intrinsic 파라미터를 사용합니다. 또한, 저희 카메라는 롤링 캘리브레이션을 사용하는데, 이는 포인트 클라우드가 온도, 색상 채널, 그리고 조리개(조정 가능한 조리개를 지원하는 카메라의 경우)의 함수로 생성됨을 의미합니다.

3D-to-2D Mapping in Zivid Cameras

모든 카메라는 공간의 3D 점과 그에 해당하는 2D 픽셀 인덱스 사이에 물리적 관계를 가지고 있습니다. Zivid 카메라의 경우:

  • 동일한 해상도: 2D 및 3D 데이터의 해상도가 동일한 경우 두 데이터 간에 직접적인 1:1 매핑이 존재합니다.

  • 다른 해상도: 2D 및 3D 해상도가 다른 경우 매핑은 다음 설정에 따라 달라집니다.

    • Settings2D::Sampling::Pixel

    • Settings::Sampling::Pixel

2D 데이터와 3D 데이터 간의 1:1 대응을 유지하려면 Settings::Processing::Resampling 설정을 사용하여 3D 포인트 클라우드를 리샘플링할 수 있습니다. 자세한 내용은 Resampling 을 참조하세요.

Alternatively, if resampling is not performed, you can use Experimental::Calibration::pixelMapping to get correct point-to-pixel mapping for any combination of 2D and 3D settings.

조심

다음과 같은 이유로 카메라 내장 기능을 사용하지 않는 것이 좋습니다.

  • 정보 손실: 근사치로 인해 귀중한 정보가 손실될 수 있습니다.

  • 더 나은 대안: 비슷하거나 더 나은 결과를 얻기 위해 더 효과적인 방법을 사용할 수 있는 경우가 많습니다.

Intrinsics 함수 대신 포인트 클라우드 데이터를 직접 사용하고 pixel mapping 을 사용하는 것이 좋습니다.

Zivid 카메라 모델은 독점적이므로 SDK에서 내부 카메라 Intrinsics 함수를 사용할 수 없습니다. 그러나 많은 머신 비전 알고리즘이 표준 모델에 의존하기 때문에 Zivid는 호환성을 위해 OpenCV 및 Halcon 내장 함수 모델의 근사값을 제공합니다.

OpenCV camera intrinsics

Zivid SDK는 OpenCV 카메라 Intrinsics 기능을 얻을 수 있는 몇 가지 옵션을 제공합니다.

C++

C#

Python

Arguments

Resolution the returned intrinsics correspond to

intrinsics

Calibrator.Intrinsics

intrinsics

camera

카메라의 Settings::Sampling::Pixel 의 기본값

intrinsics

Calibrator.Intrinsics

intrinsics

camera, settings

settings 에서 Settings::Sampling::Pixel 과 Settings::Resampling 의 조합

intrinsics

Calibrator.Intrinsics

intrinsics

camera, settings_2d

settings_2d 에서 Zivid::Settings2D::Sampling::Pixel 의 값

estimateIntrinsics

Calibrator.EstimateIntrinsics

estimate_intrinsics

frame

frame 을 캡처하는 데 사용된 Settings::Sampling::Pixel 과 Settings::Resampling 의 조합

가장 정확한 결과를 얻으려면 포인트 클라우드에서 Intrinsics을 추정하는 것이 좋습니다. 하드코딩된 카메라 Intrinsics은 단일 조리개와 단일 온도에 대해 제공됩니다. 따라서 추정된 Intrinsics만큼 정확하지는 않습니다. 각 카메라 모델별 값은 아래 목록을 참조하십시오.

Camera Model

Lens Temperature (°C)

Aperture

Zivid 3

35

3.0 (fixed)

Zivid 2+

35

2.68

Zivid 2

35

2.30

추정된 카메라 Intrinsics

카메라의 내부 특성은 촬영 중 사용된 온도와 조리개를 고려하여 포인트 클라우드에서 추정됩니다.

예상 OpenCV Intrinsics를 얻으려면 먼저 카메라에 연결해야 합니다.

소스로 이동

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()

프레임을 얻으려면 캡처 함수를 호출하세요.

소스로 이동

source

const auto frame = camera.capture2D3D(settings);
소스로 이동

소스

using (var frame = camera.Capture2D3D(settings))
{
소스로 이동

소스

frame = camera.capture_2d_3d(settings=settings)

그런 다음 프레임에서 Intrinsics를 추정할 수 있습니다.

소스로 이동

source

const auto estimated_intrinsics = Zivid::Experimental::Calibration::estimateIntrinsics(frame);
소스로 이동

소스

var estimatedIntrinsics = Zivid.NET.Experimental.Calibration.Calibrator.EstimateIntrinsics(frame);
소스로 이동

소스

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

estimate intrinsics 함수는 샘플링 전략을 고려합니다. 예를 들어 Settings::Sampling::Pixel 을 by2x2 로 설정하고 Settings::Resampling 을 disabled 로 설정하면 올바른(서브샘플링된) Intrinsics를 얻습니다:

소스로 이동

source

const auto settingsSubsampled = subsampledSettingsForCamera(camera);
const auto frame = camera.capture2D3D(settingsSubsampled);
const auto estimatedIntrinsicsForSubsampledSettings =
    Zivid::Experimental::Calibration::estimateIntrinsics(frame);
소스로 이동

소스

var settingsSubsampled = SubsampledSettingsForCamera(camera);
using (var frameSubsampled = camera.Capture2D3D(settingsSubsampled))
{
    var estimatedIntrinsicsForSubsampledSettings = Zivid.NET.Experimental.Calibration.Calibrator.EstimateIntrinsics(frameSubsampled);
소스로 이동

소스

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)
하드코딩된 카메라 Intrinsics

단일 조리개와 온도에 대해 하드코딩된 내장 함수가 제공됩니다. 하드코딩된 카메라 Intrinsics 함수를 얻으려면 먼저 카메라에 연결하세요.

소스로 이동

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 카메라 Intrinsics 함수를 얻을 수 있습니다.

소스로 이동

source

std::cout << "Getting camera intrinsics" << std::endl;
const auto intrinsics = Zivid::Experimental::Calibration::intrinsics(camera);
소스로 이동

소스

Console.WriteLine("Getting camera intrinsics");
var intrinsics = Zivid.NET.Experimental.Calibration.Calibrator.Intrinsics(camera);
소스로 이동

소스

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

샘플링하는 경우 settings 에서 사용된 Settings::Sampling::Pixel 과 Settings::Resampling 의 조합에 해당하는 OpenCV 카메라 Intrinsics를 얻을 수 있습니다:

소스로 이동

source

const auto settingsSubsampled = subsampledSettingsForCamera(camera);
const auto fixedIntrinsicsForSubsampledSettings =
    Zivid::Experimental::Calibration::intrinsics(camera, settingsSubsampled);
소스로 이동

소스

var settingsSubsampled = SubsampledSettingsForCamera(camera);
var fixedIntrinsicsForSubsampledSettings = Zivid.NET.Experimental.Calibration.Calibrator.Intrinsics(camera, settingsSubsampled);
소스로 이동

소스

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);
소스로 이동

소스

var settings2D = new Zivid.NET.Settings2D
{
    Acquisitions = { new Zivid.NET.Settings2D.Acquisition { } }
};
var fixedIntrinsicsForSettings2D = Zivid.NET.Experimental.Calibration.Calibrator.Intrinsics(camera, settings2D);
소스로 이동

소스

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

조심

Hard-coded OpenCV intrinsics are fixed and do not adapt to changes in temperature or aperture, unlike intrinsics estimated from the point cloud. This means they may not match captures taken under different conditions.

주변 온도 변화는 카메라 내부 온도에 영향을 미칩니다. 열 안정화가 도움이 되지만, 렌즈 온도는 촬영 시작 시점과 안정화 후 사이에 상당한 차이를 보일 수 있습니다. 이러한 온도 차이는 하드코딩된 Intrinsics과 포인트 클라우드 데이터 간의 불일치를 초래할 수 있습니다. 특히 각 촬영마다 다른 조리개를 사용하는 HDR 모드에서 조리개 변화는 하드코딩된 Intrinsics의 정확도를 더욱 어렵게 만듭니다. 이는 Zivid 3의 조리개가 고정되어 있기 때문에 Zivid 2+ 및 Zivid 2 카메라에만 해당됩니다.

이러한 복잡성으로 인해, 더 정확한 결과를 얻으려면 포인트 클라우드에서 카메라 Intrinsics을 추정하는 것이 좋습니다.

Saving camera intrinsics

다음 코드를 사용하여 OpenCV 카메라 Intrinsics 함수를 YML 파일에 저장할 수 있습니다.

소스로 이동

source

const auto outputFile = "Intrinsics.yml";
std::cout << "Saving camera intrinsics to file: " << outputFile << std::endl;
intrinsics.save(outputFile);
소스로 이동

소스

var intrinsicsFile = "Intrinsics.yml";
Console.WriteLine("Saving camera intrinsics to file: " + intrinsicsFile);
intrinsics.Save(intrinsicsFile);
소스로 이동

소스

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

Halcon camera intrinsics

Halcon은 Zivid 및 OpenCV 카메라 모델과 다른 카메라 모델을 사용합니다. Halcon Intrinsics를 가져오는 두 가지 옵션이 있으며 둘 다 OpenCV 모델의 근사값을 기반으로 합니다.

조심

Halcon 내장 함수(카메라 내부 매개변수)를 사용해야 하는 경우, 아래 설명된 방법 중 하나를 사용하여 가져오세요. Halcon 내장 함수를 얻기 위해 2D 카메라를 Halcon에서 보정하지 마세요. 이 방법은 저희 카메라에서는 제대로 작동하지 않습니다.

카메라에서

요구 사항:

  • Python 설치 및 Python 스크립트 실행

  • Zivid-Python 설치됨

카메라용 Halcon Intrinsics를 얻는 가장 간단한 방법은 convert_intrinsics_opencv_to_halcon.py 코드 샘플을 실행하는 것입니다. example when reading from camera 를 중심으로 샘플 설명을 읽어보십시오.

참고

이 방법은 하드 코딩된 카메라 Intrinsics를 가져오는 것으로 제한됩니다.

YML 파일에서

요구 사항:

  • Python 설치 및 Python 스크립트 실행

  • C++ 또는 C# 코드 샘플 빌드

카메라용 Halcon Intrinsics를 가져오는 다른 방법은 YML 파일에서 OpenCV 카메라 Intrinsics를 로드하고 Halcon 형식으로 변환하는 것입니다.

OpenCV 카메라 Intrinsics을 가져오고 파일에 저장하려면 다음 샘플 중 하나를 실행합니다.

OpenCV 카메라 Intrinsics를 가져와 파일에 저장하려면 GetCameraIntrinsics.cpp 실행합니다. Configure C++ Samples With CMake and Build Them in Visual Studio in Windows 을 참고하십시오.

OpenCV 카메라 Intrinsics를 가져와서 파일에 저장하려면 GetCameraIntrinsics.cs 실행합니다. C# 샘플 Build C# Samples using Visual Studio 을 참고하십시오.

OpenCV 카메라 Intrinsics를 가져와서 파일에 저장하려면 get_camera_intrinsics.py 실행합니다.

그런 다음 convert_intrinsics_opencv_to_halcon.py 코드 샘플을 실행합니다. Example when reading from camera 를 중심으로 샘플 설명을 읽어보십시오.

참고

이 방법을 사용하면 하드코딩된 카메라 Intrinsics와 포인트 클라우드에서 추정된 카메라 Intrinsics를 모두 가져올 수 있습니다. 그러나 후자의 경우 Intrinsics이 필요한 각 캡처에 대해 파일에서 저장 및 로드한다고 가정합니다.

ZDF 파일에서

요구 사항:

  • Python 설치 및 Python 스크립트 실행

  • Zivid-Python 설치됨

카메라의 예상 Halcon 내부 매개변수를 얻는 가장 간단한 방법은 convert_intrinsics_opencv_to_halcon.py 코드 샘플을 실행하는 것입니다. 샘플 설명, 특히 ZDF 파일에서 읽는 예시 부분을 자세히 읽어보세요.

참고

이 방법은 카메라 내부 매개변수를 추정하는 데에만 국한됩니다.

Which camera intrinsics should I use?

In general, we recommend using the actual point cloud data and Experimental::Calibration::pixelMapping rather than intrinsics. If absolutely necessary, see the following guidelines for choosing the correct camera intrinsics.

Hard-coded camera intrinsics

다음 시나리오에서만 하드코딩된 카메라 내장 함수를 사용하는 것이 좋습니다.

  • 다음 중 하나의 경우:

    • You get the color image from a single 2D acquisition using Camera::capture2D()

    • You get the color image from a single 2D acquisition using Camera::capture2D() and the point cloud from a single 3D acquisition using Camera::capture3D()

    • You get the color image from a single 2D acquisition and the point cloud from a single 3D acquisition using Camera::capture2D3D()

  • 2D와 3D 모두에 사용되는 조리개는 하드코딩된 것과 비슷합니다. table 표를 참조하세요 (이는 Zivid 3에는 고정 조리개가 있으므로 Zivid 2+ 및 Zivid 2 카메라에만 적용됩니다).

  • 실내 온도에 가까운 온도용.

  • 2D 데이터만 사용하는 애플리케이션의 경우(예: 직선을 감지하기 위해 이미지 왜곡 제거).

Camera intrinsics estimated from point cloud

거의 모든 시나리오에서 Estimated Intrinsics를 사용하는 것이 좋습니다.

  • 컬러 이미지와 포인트 클라우드를 어떻게 얻었는지와는 상관없이, 포인트 클라우드는 하드코딩된 Intrinsics 함수에 해당하는 온도와 다른 조리개와 온도에서 획득한 결과일 가능성이 높기 때문입니다.

  • OpenCV Intrinsics 함수를 사용하는 모든 사용 사례는 다음과 같습니다.

    • projectPoints()를 사용하여 3D 데이터를 2D 이미지로 프로젝션합니다.

    • solvePnP()를 사용하여 2D 이미지에서 3D 포즈를 추정합니다.

참고

추정된 카메라 Intrinsics 함수는 하드코딩된 카메라 내장 함수를 권장하는 모든 경우에 잘 작동합니다. 그러나 Intrinsics 함수를 추정하는 데는 약간의 계산 시간이 소요되는 반면, 카메라에서 하드코딩된 Intrinsics 함수를 가져오는 것은 즉시 이루어집니다.

2D and 3D capture with different resolution

pixel mapping 과 포인트 클라우드 데이터를 사용하여 2D에서 3D로 변환하는 것을 권장합니다. 이렇게 하면 해상도 차이를 정확하게 처리할 수 있습니다.

또 다른 방법은 2D 이미지를 다운샘플링하거나 서브샘플링하여 3D 해상도에 맞춰 2D 데이터의 해상도를 3D 데이터에 맞추는 것입니다. 자세한 내용은 Sampling (3D) , Sampling (2D) , 그리고 Resampling 을 참고하세요.

If you still need to use intrinsics, we recommend estimating them from the captured frame (see the table above).

Hand-Eye Calibration

We recommend our own Hand-Eye Calibration calibration, as it is best suited for Zivid cameras. Our hand-eye calibration method does not require camera intrinsics; however, many other methods do. If you use one of the other methods, we recommend estimating intrinsics from the point cloud. Read more about choosing the correct Hand-Eye calibration method.

Projecting 3D points to a 2D image plane

We recommend estimating intrinsics from the point cloud when projecting Zivid point clouds onto a 2D image plane.

이렇게 하면 하드코딩된 Intrinsics 함수를 사용하는 것보다 재프로젝션 오류가 더 작아집니다. 하지만 Gaussian Smoothing 및 Contrast Distortion Filter 같이 필터 사용에 주의하세요. 보정 필터 없이 캡처한 포인트 클라우드에 추정 Intrinsics 함수를 사용하는 경우 1픽셀 미만의 재프로젝션 오류가 예상됩니다. 보정 필터를 사용하는 경우, 보정이 상당히 진행된 포인트의 재프로젝션 오류가 더 커집니다. 그러나 대부분의 포인트에서는 1픽셀 미만의 재프로젝션 오류가 발생합니다.

Downsampled or Subsampled 2D

2D 데이터를 하위 샘플링/다운 샘플링하면 2D와 3D 사이의 직접적인 1:1 매핑을 다시 얻을 수 있습니다. 자세한 내용은 Sampling (3D) 을 참조하세요.

전체 해상도 2D 이미지를 다운샘플링할 때는 다운샘플링된 픽셀을 생성하는 데 어떤 픽셀이 사용되는지 이해하는 것이 중요합니다. 원하는 픽셀을 중심으로 대칭적으로 픽셀을 사용하는 경우, 평균 픽셀은 3D 데이터에 해당하는 픽셀 위치에 있어야 합니다. 이는 SDK에서 제공하는 Intrinsics 함수와 가장 잘 일치합니다.

자세한 내용은 다음을 참조하세요.

Estimating 3D pose from a 2D image

When projecting 2D pixel into 3D space, we recommend estimating intrinsics from the point cloud.

하드코딩된 카메라 Intrinsics 함수와 비교했을 때, 포인트 클라우드에서 추정된 Intrinsics 함수가 더 나은 결과를 제공합니다. 하지만 포인트 클라우드에서 직접 포즈를 추정하는 것이 더 정확하므로 권장됩니다.

2D image processing algorithms

어플리케이션에 2D 데이터만 사용하는 경우 하드 코딩된 Intrinsics 및 포인트 클라우드에서 추정된 Intrinsics 데이터가 제대로 작동합니다. 예를 들어 2D 이미지의 왜곡을 제거하여 렌즈 왜곡을 보정하여 직선을 감지할 수 있습니다.

Version History

SDK

Changes

2.17.0

Zivid 3 XL250에 대한 지원이 추가되었습니다.

2.10.0

Monochrome Capture 사용하기 전에 Intrinsics 기능을 수정해야 합니다.