Stereo Disparity 3D
1 개요
Rectify 된 이미지 쌍을 사용하여 3차원 모델을 재구성하는 알고리즘입니다.
2 알고리즘 상세 설명
스테레오 카메라로 찍은 이미지 쌍 또는 Stereo Calibrate의 Rectification 결과 이미지 쌍으로부터 3D Image인 Disparity Map을 구할 수 있습니다. Stereo Rectification 된 이미지 쌍일 때와 찍은 두 위치의 거리가 클수록 퀄리티 높은 결과를 얻을 수 있습니다. 설정할 수 있는 파라미터를 이미지 쌍의 환경에 따라 적절히 조절함으로써 Disparity Map의 퀄리티를 높일 수 있습니다.
Source Left Image | Source Right Image | Destination Image |
---|---|---|
![]() |
![]() |
![]() |
각 파라미터에 대한 정보는 다음과 같습니다.
- Minimum Disparity: 찾을 픽셀의 최소 거리를 설정합니다.
- Maximum Disparity: 찾을 픽셀의 최대 거리를 설정합니다.
Disparity의 범위는 연산 결과에 많은 영향을 줍니다. Disparity는 Source 1을 기준으로 합니다. 밑은 Min/Max Disparity가 둘 다 음수, Min이 음수이고 Max가 양수, 둘 다 양수인 경우의 Diagram과 이미지입니다.
Disparity Diagram | Disparity Image |
---|---|
![]() |
![]() |
Disparity의 설정에 있어 Source 1 이미지가 Source 2 이미지 보다 왼쪽에서 찍은 경우 두 Disparity의 값을 음수로, 오른쪽에서 찍은 경우 두 Disparity의 값을 양수로 설정하면 됩니다. 다른 부호를 사용하여 두 Disparity 값의 설정이 가능하지만, 대부분의 경우 주어진 이미지를 통해서 Disparity의 부호를 결정할 수 있습니다.
해당 이미지의 Disparity가 확실하지 않는 경우 넓은 범위의 Disparity를 설정하고 Auto Adjust Width의 기능을 키면 이미지의 크기를 줄이지 않고 결과를 얻을 수 있습니다.
- Match Block Size: 픽셀의 Score를 비교할 Block의 크기를 설정합니다. 너무 낮은 값을 설정할 때 디테일이 없어지며 너무 높은 값을 설정할 때 Noise 오류가 높아집니다.
- Maximum Difference: 특정한 픽셀에 가장 맞는 픽셀 Score의 기준값을 설정합니다. 해당 기준값을 넘지 못하는 픽셀은 결과에 반영되지 않습니다.
- Uniqueness Ratio: 특정한 픽셀에 가장 맞는 픽셀의 Score가 다른 Score의 차가 일정값 이상이 되는 경우에만 결과에 반영됩니다. 해당 값을 낮게 설정할 경우 잘못된 픽셀이 Match 되고 높게 설정할 경우 아무 Match도 발생하지 않아 오류가 발생할 수 있습니다. 해당 값은 0~1까지의 값을 설정할 수 있으며 0~0.2의 값을 권장하고 있습니다.
- P1, P2: 다른 위치의 픽셀에 대한 Score를 조절합니다. 해당 값을 크게 설정할수록 옆 픽셀의 Score가 더 높게 반영됩니다.
- Filter Size: 알고리즘 결과에 적용되는 Median Filter의 크기를 설정합니다.
- Height Coefficient: 결과 이미지의 최대 높이를 설정합니다.
- Auto Adjust Width: 연산 과정에서 모든 Disparity를 고려할지 안할지 선택합니다. 모든 Disparity를 고려하는 경우 결과의 정확도는 올라가지만 이미지의 크기가 Disparity의 범위에 따라서 줄어듭니다. 일부분의 Disparity를 고려하는 경우 이미지의 크기가 줄지 않지만 이미지의 양 끝의 정확도가 낮아집니다.
3 예제 코드
다음 코드로 Stereo Disparity의 설정 후 실행이 가능합니다.
// 객체 생성
CStereoDisparity3D stereoDisparity3D;
// 입력 이미지 설정
CFLImage fliSourceImage;
stereoDisparity3D.SetSourceImage(fliSourceImage);
// 입력 이미지 설정 2
CFLImage fliSourceImage2;
stereoDisparity3D.SetSourceImage2(fliSourceImage2);
// 출력 Height Map 설정
CFLImage fliDestinationHeightMapImage;
stereoDisparity3D.SetDestinationHeightMapImage(fliDestinationHeightMapImage);
// 출력 3D 객체 설정
CFL3DObjectHeightMap fl3DOHM;
stereoDisparity3D.SetDestinationObject(fl3DOHM);
// Texture 이미지 설정
CFLImage fliTextureImage;
stereoDisparity3D.SetDestinationTextureImage(fliTextureImage);
// 찾을 픽셀의 최소 거리 설정
int32_t i32MinimumDisparities = -100;
stereoDisparity3D.SetMinimumDisparity(i32MinimumDisparities);
// 찾을 픽셀의 최대 거리 설정
int32_t i32MaximumDisparities = 0;
stereoDisparity3D.SetMaximumDisparity(i32MaximumDisparities);
// 픽셀의 Score를 비교할 높이 설정
int32_t i32MatchBlockSize = 5;
stereoDisparity3D.SetMatchBlockSize(i32MatchBlockSize);
// 픽셀 Score의 기준값 설정
int32_t i32MaximumDifference = 30;
stereoDisparity3D.SetMaximumDifference(i32MaximumDifference);
// 픽셀의 Score 비교 비율 값 설정
double f64UniquenessRatio = 0.0;
stereoDisparity3D.SetUniquenessRatio(f64UniquenessRatio);
// 다른 위치의 픽셀에 대한 Score를 조절 값 설정
double f64P1 = 200.0;
stereoDisparity3D.SetP1(f64P1);
double f64P2 = 800.0;
stereoDisparity3D.SetP2(f64P2);
// 결과 Median Filter 적용 사이즈 설정
int32_t i32FilterSize = 5;
stereoDisparity3D.SetFilterSize(i32FilterSize);
// 미확실 결과 영역 출력 여부 설정
bool bAutoAdjustWidth = false;
stereoDisparity3D.EnableAutoAdjustWidth(bAutoAdjustWidth);
// 알고리즘 실행
stereoDisparity3D.Execute();
4 추가 함수 설명
파라미터 설정 및 불러오기
// 객체 생성
CStereoDisparity3D stereoDisparity3D;
// Minimum Disparity 설정합니다.
int32_t i32SetMinimumDisparity = -100;
stereoDisparity3D.SetMinimumDisparity(i32SetMinimumDisparity);
// 설정된 Minimum Disparity 가져옵니다.
int32_t i32GetMinimumDisparity;
i32GetMinimumDisparity = stereoDisparity3D.GetMinimumDisparity();
함수 SetMinimumDisparity
으로 Minimum Disparity의 설정이 가능합니다.
함수 GetMinimumDisparity
으로 설정된 Minimum Disparity을 가져올 수 있습니다.
잘못된 값을 설정할 때 결과에 오류가 발생할 확률이 있습니다.
i32MinimumDisparity
- Default Value : -100, Recommended Value : -
// Maximum Disparity 설정합니다.
int32_t i32SetMaximumDisparity = 0;
stereoDisparity3D.SetMaximumDisparity(i32SetMaximumDisparity);
// 설정된 Maximum Disparity 가져옵니다.
int32_t i32GetMaximumDisparity;
i32GetMaximumDisparity = stereoDisparity3D.GetMaximumDisparity();
함수 SetMaximumDisparity
으로 Maximum Disparity의 설정이 가능합니다.
함수 GetMaximumDisparity
으로 설정된 Maximum Disparity을 가져올 수 있습니다.
잘못된 값을 설정할 때 결과에 오류가 발생할 확률이 있습니다.
i32MaximumDisparity
- Default Value : 0, Recommended Value : -
// Match Block Size를 설정합니다.
int32_t i32SetMatchBlockSize = 5;
stereoDisparity3D.SetMatchBlockSize(i32SetMatchBlockSize);
// 설정된 Match Block Size를 가져옵니다.
int32_t i32GetMatchBlockSize;
i32GetMatchBlockSize = stereoDisparity3D.GetMatchBlockSize();
함수 SetMatchBlockSize
로 Match Block 크기의 설정이 가능합니다.
함수 GetMatchBlockSize
로 설정된 Match Block의 크기를 가져올 수 있습니다.
잘못된 값을 설정할 때 결과에 오류가 발생할 확률이 있습니다.
i32MatchBlockSize
- Default Value : 5, Recommended Value : 5
// Maximum Difference를 설정합니다.
int32_t i32SetMaximumDifference = 30;
stereoDisparity3D.SetMaximumDifference(i32SetMaximumDifference);
// 설정된 Maximum Difference를 가져옵니다.
int32_t i32GetMaximumDifference;
i32GetMaximumDifference = stereoDisparity3D.GetMaximumDifference();
함수 SetMaximumDifference
으로 Maximum Difference의 설정이 가능합니다.
함수 GetMaximumDifference
으로 설정된 Maximum Difference를 가져올 수 있습니다.
잘못된 값을 설정할 때 결과에 오류가 발생할 확률이 있습니다.
i32MaximumDifference
- Default Value : 30, Recommended Value : -
// Uniqueness Ratio를 설정합니다.
double f64SetUniquenessRatio = 0.0;
stereoDisparity3D.SetUniquenessRatio(f64SetUniquenessRatio);
// 설정된 Uniqueness Ratio를 가져옵니다.
double f64GetUniquenessRatio;
f64GetUniquenessRatio = stereoDisparity3D.GetUniquenessRatio();
함수 SetUniquenessRatio
으로 Uniqueness Ratio의 설정이 가능합니다.
함수 GetUniquenessRatio
으로 설정된 Uniqueness Ratio를 가져올 수 있습니다.
해당 값은 %를 기준으로 두며 100 이상 0 미만의 값을 설정할 때 오류가 발생합니다.
잘못된 값을 설정할 때 결과에 오류가 발생할 확률이 있습니다.
i32UniquenessRatio
- Default Value : 0, Recommended Value : 0 ~ 0.2
// P1을 설정합니다.
double f64SetP1 = 200.0;
stereoDisparity3D.SetP1(f64SetP1);
// 설정된 P1을 가져옵니다.
double f64GetP1;
f64GetP1 = stereoDisparity3D.GetP1();
함수 SetP1
으로 P1의 설정이 가능합니다.
함수 GetP1
으로 설정된 P1을 가져올 수 있습니다.
잘못된 값을 설정할 때 결과에 오류가 발생할 확률이 있습니다.
f64P1
- Default Value : 200, Recommended Value : 8 * (Block Size ^ 2)
// P2를 설정합니다.
double f64SetP2 = 800.0;
stereoDisparity3D.SetP2(f64SetP2);
// 설정된 P2를 가져옵니다.
double f64GetP2;
f64GetP2 = stereoDisparity3D.GetP2();
함수 SetP2
으로 P2의 설정이 가능합니다.
함수 GetP2
으로 설정된 P2를 가져올 수 있습니다.
P2의 값은 기본적으로 P1보다 큰 값을 사용합니다.
잘못된 값을 설정할 때 결과에 오류가 발생할 확률이 있습니다.
f64P2
- Default Value : 800, Recommended Value : 32 * (Block Size) ^ 2
// Median Filter Size를 설정합니다.
int32_t i32SetFilterSize = 5;
stereoDisparity3D.SetFilterSize(i32SetFilterSize);
// 설정된 Median Filter Size를 가져옵니다.
int32_t i32GetFilterSize;
i32GetFilterSize = stereoDisparity3D.GetFilterSize();
함수 SetFilterSize
로 Median Filter Size의 설정이 가능합니다.
함수 GetFilterSize
로 설정된 Median Filter Size를 가져올 수 있습니다.
잘못된 값을 설정할 때 결과에 오류가 발생할 확률이 있습니다.
i32FilterSize
- Default Value : 5, Recommended Value : -
// 너비 자동 설정 여부를 선택합니다.
bool bSetAutoAdjustWidth = false;
stereoDisparity3D.EnableAutoAdjustWidth(bSetAutoAdjustWidth);
// 너비 자동 설정 여부를 가져옵니다.
bool bGetAutoAdjustWidth;
bGetAutoAdjustWidth = stereoDisparity3D.IsAutoAdjustWidthEnabled();
함수 EnableAutoAdjustWidth
으로 미확실 영역의 출력 여부 설정이 가능합니다.
함수 IsAutoAdjustWidthEnabled
으로 설정된 미확실 영역의 출력 여부를 가져올 수 있습니다.\
bGetAutoAdjustWidth
- Default Value : false, Recommended Value : -
// Height Coefficient를 설정합니다.
double f64SetHeightCoefficient = 100.0;
stereoDisparity3D.SetHeightCoefficient(f64SetHeightCoefficient);
// 설정된 Height Coefficient를 가져옵니다.
double f64GetHeightCoefficient;
f64GetHeightCoefficient = stereoDisparity3D.GetHeightCoefficient();
함수 SetHeightCoefficient
으로 Height Coefficient의 설정이 가능합니다.
함수 GetHeightCoefficient
으로 설정된 Height Coefficient를 가져올 수 있습니다.\
f64Coefficient
- Default Value : 100.0, Recommended Value : -
5 출처
[1] Dijkstra, E. W. (1968). Go to statement considered harmful. Communications of the ACM, 11(3), 147-148.