Camera Intrinsics
Zivid camera model is more complex, using more intrinsic parameters, than some well-known pinhole camera models (e.g., OpenCV camera model). In addition, our cameras utilize a rolling calibration, which means that the point clouds are generated as a function of temperature, color channels, and aperture (for the cameras that support adjustable aperture).
Zivid 카메라의 3D-2D 매핑
모든 카메라는 공간의 3D 점과 그에 해당하는 2D 픽셀 인덱스 사이에 물리적 관계를 가지고 있습니다. Zivid 카메라의 경우:
동일한 해상도: 2D 및 3D 데이터의 해상도가 동일한 경우 두 데이터 간에 직접적인 1:1 매핑이 존재합니다.
다른 해상도: 2D 및 3D 해상도가 다른 경우 매핑은 다음 설정에 따라 달라집니다.
Settings2D::Sampling::PixelZivid::Settings::Sampling::Pixel
2D 데이터와 3D 데이터 간의 1:1 대응을 유지하려면 Settings::Processing::Resampling 설정을 사용하여 3D 포인트 클라우드를 리샘플링할 수 있습니다. 자세한 내용은 Resampling 을 참조하세요.
또는 리샘플링을 수행하지 않으면 pixelMapping(camera, settings) 함수를 사용하여 2D 및 3D 설정의 모든 조합에 대해 올바른 포인트-픽셀 매핑을 얻을 수 있습니다.
조심
다음과 같은 이유로 카메라 내장 기능을 사용하지 않는 것이 좋습니다.
정보 손실: 근사치로 인해 귀중한 정보가 손실될 수 있습니다.
더 나은 대안: 비슷하거나 더 나은 결과를 얻기 위해 더 효과적인 방법을 사용할 수 있는 경우가 많습니다.
Intrinsics 함수 대신 포인트 클라우드 데이터를 직접 사용하고 pixel mapping 을 사용하는 것이 좋습니다.
Zivid 카메라 모델은 독점적이므로 SDK에서 내부 카메라 Intrinsics 함수를 사용할 수 없습니다. 그러나 많은 머신 비전 알고리즘이 표준 모델에 의존하기 때문에 Zivid는 호환성을 위해 OpenCV 및 Halcon 내장 함수 모델의 근사값을 제공합니다.
OpenCV camera intrinsics
Zivid SDK는 OpenCV 카메라 Intrinsics 기능을 얻을 수 있는 몇 가지 옵션을 제공합니다.
Function name |
Resolution the returned intrinsics correspond to |
|---|---|
|
카메라의 |
|
|
|
|
|
|
가장 정확한 결과를 얻으려면 포인트 클라우드에서 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 |
카메라의 내부 특성은 촬영 중 사용된 온도와 조리개를 고려하여 포인트 클라우드에서 추정됩니다.
예상 OpenCV Intrinsics를 얻으려면 먼저 카메라에 연결해야 합니다.
프레임을 얻으려면 캡처 함수를 호출하세요.
그런 다음 프레임에서 Intrinsics를 추정할 수 있습니다.
estimate Intrinsics 함수는 샘플링 전략을 고려합니다. 예를 들어, Zivid::Settings::Sampling::Pixel by2x2 로 설정하고 Zivid::Settings::Resampling 을 disabled 로 설정하면 올바른 (서브샘플링된) Intrinsics 함수를 얻습니다.
const auto settingsSubsampled = subsampledSettingsForCamera(camera);
const auto frame = camera.capture2D3D(settingsSubsampled);
const auto estimatedIntrinsicsForSubsampledSettings =
Zivid::Experimental::Calibration::estimateIntrinsics(frame);
단일 조리개와 온도에 대해 하드코딩된 내장 함수가 제공됩니다. 하드코딩된 카메라 Intrinsics 함수를 얻으려면 먼저 카메라에 연결하세요.
그러면 기본 OpenCV 카메라 Intrinsics 함수를 얻을 수 있습니다.
std::cout << "Getting camera intrinsics" << std::endl;
const auto intrinsics = Zivid::Experimental::Calibration::intrinsics(camera);
샘플링하는 경우 Zivid::Settings::Sampling::Pixel 과 Zivid::Settings::Resampling settings 조합에 해당하는 OpenCV 카메라 Intrinsics 함수를 얻을 수 있습니다.
const auto settingsSubsampled = subsampledSettingsForCamera(camera);
const auto fixedIntrinsicsForSubsampledSettings =
Zivid::Experimental::Calibration::intrinsics(camera, settingsSubsampled);
2D 설정에 대한 하드코딩된 내장 함수의 경우:
const auto settings2D =
Zivid::Settings2D{ Zivid::Settings2D::Acquisitions{ Zivid::Settings2D::Acquisition{} } };
const auto fixedIntrinsicsForSettings2D = Zivid::Experimental::Calibration::intrinsics(camera, settings2D);
조심
하드코딩된 OpenCV 내장 함수는 estimateIntrinsics 와 달리 고정되어 있어 온도나 조리개 변화에 따라 조정되지 않습니다. 즉, 다른 조건에서 촬영한 이미지와 일치하지 않을 수 있습니다.
Ambient temperature variations affect the camera’s internal temperature. While Thermal Stabilization helps, the lens temperature can still differ significantly between the start of deployment and after stabilization. This temperature difference can cause discrepancies between hard-coded intrinsics and point cloud data. Aperture variations, especially in HDR mode where each acquisition uses a different aperture, further complicate the accuracy of hard-coded intrinsics. This is true only for Zivid 2+ and Zivid 2 cameras, as Zivid 3 has a fixed aperture.
이러한 복잡성으로 인해, 더 정확한 결과를 얻으려면 포인트 클라우드에서 카메라 Intrinsics을 추정하는 것이 좋습니다.
Saving camera intrinsics
다음 코드를 사용하여 OpenCV 카메라 Intrinsics 함수를 YML 파일에 저장할 수 있습니다.
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를 가져오는 것으로 제한됩니다.
요구 사항:
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이 필요한 각 캡처에 대해 파일에서 저장 및 로드한다고 가정합니다.
Which camera intrinsics should I use?
일반적으로 Intrinsics 함수 대신 실제 포인트 클라우드 데이터와 pixelMapping(camera, settings) 함수를 사용하는 것이 좋습니다. 꼭 필요한 경우, 다음 지침을 참조하여 올바른 카메라 Intrinsics 함수를 선택하세요.
Hard-coded camera intrinsics
다음 시나리오에서만 하드코딩된 카메라 내장 함수를 사용하는 것이 좋습니다.
다음 중 하나의 경우:
capture2D()를 사용하여 단일 2D 수집에서 컬러 이미지를 얻습니다.capture2D()사용하여 단일 2D 획득으로부터 컬러 이미지를 얻고,capture3D()사용하여 단일 3D 획득으로부터 포인트 클라우드를 얻습니다.capture2D3D()사용하면 단일 2D 획득에서 컬러 이미지를 얻고 단일 3D 획득에서 포인트 클라우드를 얻습니다.
For apertures (used for both 2D and 3D) similar to the hard-coded one; see the table (this applies only for Zivid 2+ and Zivid 2 cameras, as Zivid 3 has a fixed aperture).
실내 온도에 가까운 온도용.
2D 데이터만 사용하는 애플리케이션의 경우(예: 직선을 감지하기 위해 이미지 왜곡 제거).
포인트 클라우드에서 추정된 카메라 Intrinsics
거의 모든 시나리오에서 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 을 참고하세요.
여전히 Intrinsics 함수를 사용해야 하는 경우 estimateIntrinsics(frame) 을 사용하는 것이 좋습니다.
Hand-Eye Calibration
Zivid 카메라에 가장 적합한 자체 Hand-Eye Calibration 보정을 권장합니다. 저희의 핸드-아이 보정 방법은 카메라 Intrinsics 함수를 필요로 하지 않지만, 다른 많은 방법들은 내장 함수를 필요로 합니다. 다른 방법을 사용하는 경우, 포인트 클라우드에서 estimateIntrinsics() 사용하는 것이 좋습니다. choosing the correct Hand-Eye calibration method 에 대해 자세히 알아보세요.
Projecting 3D points to a 2D image plane
Zivid 포인트 클라우드를 2D 이미지 평면에 투영할 때는 estimateIntrinsics 사용하는 것이 좋습니다.
이렇게 하면 하드코딩된 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
2D 픽셀을 3D 공간에 투영할 때 포인트 클라우드에서 estimateIntrinsics 사용하는 것이 좋습니다.
하드코딩된 카메라 Intrinsics 함수와 비교했을 때, 포인트 클라우드에서 추정된 Intrinsics 함수가 더 나은 결과를 제공합니다. 하지만 포인트 클라우드에서 직접 포즈를 추정하는 것이 더 정확하므로 권장됩니다.
2D image processing algorithms
어플리케이션에 2D 데이터만 사용하는 경우 하드 코딩된 Intrinsics 및 포인트 클라우드에서 추정된 Intrinsics 데이터가 제대로 작동합니다. 예를 들어 2D 이미지의 왜곡을 제거하여 렌즈 왜곡을 보정하여 직선을 감지할 수 있습니다.
Version History
SDK |
Changes |
|---|---|
2.17.0 |
Added support for Zivid 3 XL250. |
2.10.0 |
Monochrome Capture 사용하기 전에 Intrinsics 기능을 수정해야 합니다. |