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
Source Left Image Source Right Image Destination Image
Fig. Source, Calibration and Destination Images[1]

각 파라미터에 대한 정보는 다음과 같습니다.

Disparity의 범위는 연산 결과에 많은 영향을 줍니다. Disparity는 Source 1을 기준으로 합니다. 밑은 Min/Max Disparity가 둘 다 음수, Min이 음수이고 Max가 양수, 둘 다 양수인 경우의 Diagram과 이미지입니다.

Disparity Diagram Disparity Image
Disparity Diagram Disparity Image
Fig. Disparity Diagram and Image

Disparity의 설정에 있어 Source 1 이미지가 Source 2 이미지 보다 왼쪽에서 찍은 경우 두 Disparity의 값을 음수로, 오른쪽에서 찍은 경우 두 Disparity의 값을 양수로 설정하면 됩니다. 다른 부호를 사용하여 두 Disparity 값의 설정이 가능하지만, 대부분의 경우 주어진 이미지를 통해서 Disparity의 부호를 결정할 수 있습니다.

해당 이미지의 Disparity가 확실하지 않는 경우 넓은 범위의 Disparity를 설정하고 Auto Adjust Width의 기능을 키면 이미지의 크기를 줄이지 않고 결과를 얻을 수 있습니다.

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();
// 객체 생성
CStereoDisparity3D stereoDisparity3D = new CStereoDisparity3D();

// 입력 이미지 설정
CFLImage fliSourceImage = new CFLImage();
stereoDisparity3D.SetSourceImage(ref fliSourceImage);

// 입력 이미지 설정 2
CFLImage fliSourceImage2 = new CFLImage();
stereoDisparity3D.SetSourceImage2(ref fliSourceImage2);

// 출력 Height Map 설정
CFLImage fliDestinationHeightMapImage = new CFLImage();
stereoDisparity3D.SetDestinationHeightMapImage(ref fliDestinationHeightMapImage);

// 출력 3D 객체 설정
CFL3DObject fl3DOHM = new CFL3DObject();
stereoDisparity3D.SetDestinationObject(ref fl3DOHM);

// Texture 이미지 설정
CFLImage fliTextureImage = new CFLImage();
stereoDisparity3D.SetDestinationTextureImage(ref fliTextureImage);

// 찾을 픽셀의 최소 거리 설정
int i32MinimumDisparities = -100;
stereoDisparity3D.SetMinimumDisparity(i32MinimumDisparities);

// 찾을 픽셀의 최대 거리 설정
int i32MaximumDisparities = 0;
stereoDisparity3D.SetMaximumDisparity(i32MaximumDisparities);

// 픽셀의 Score를 비교할 높이 설정
int i32MatchBlockSize = 5;
stereoDisparity3D.SetMatchBlockSize(i32MatchBlockSize);

// 픽셀 Score의 기준값 설정
int 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 적용 사이즈 설정
int i32FilterSize = 5;
stereoDisparity3D.SetFilterSize(i32FilterSize);

// 미확실 결과 영역 출력 여부 설정
bool bAutoAdjustWidth = false;
stereoDisparity3D.EnableAutoAdjustWidth(bAutoAdjustWidth);

// 알고리즘 실행
stereoDisparity3D.Execute();
# 객체 생성
stereoDisparity3D = CStereoDisparity3D()

# 입력 이미지 설정
fliSourceImage = CFLImage()
stereoDisparity3D.SetSourceImage(fliSourceImage)

# 입력 이미지 설정 2
fliSourceImage2 = CFLImage()
stereoDisparity3D.SetSourceImage2(fliSourceImage2)

# 출력 Height Map 설정
fliDestinationHeightMapImage = CFLImage()
stereoDisparity3D.SetDestinationHeightMapImage(fliDestinationHeightMapImage)

# 출력 3D 객체 설정
fl3DOHM = CFL3DObject()
stereoDisparity3D.SetDestinationObject(fl3DOHM)

# Texture 이미지 설정
fliTextureImage = CFLImage()
stereoDisparity3D.SetDestinationTextureImage(fliTextureImage)

# 찾을 픽셀의 최소 거리 설정
i32MinimumDisparities = -100
stereoDisparity3D.SetMinimumDisparity(i32MinimumDisparities)

# 찾을 픽셀의 최대 거리 설정
i32MaximumDisparities = 0
stereoDisparity3D.SetMaximumDisparity(i32MaximumDisparities)

# 픽셀의 Score를 비교할 높이 설정
i32MatchBlockSize = 5
stereoDisparity3D.SetMatchBlockSize(i32MatchBlockSize)

# 픽셀 Score의 기준값 설정
i32MaximumDifference = 30
stereoDisparity3D.SetMaximumDifference(i32MaximumDifference)

# 픽셀의 Score 비교 비율 값 설정
f64UniquenessRatio = 0.0
stereoDisparity3D.SetUniquenessRatio(f64UniquenessRatio)

# 다른 위치의 픽셀에 대한 Score를 조절 값 설정
f64P1 = 200.0
stereoDisparity3D.SetP1(f64P1)

f64P2 = 800.0
stereoDisparity3D.SetP2(f64P2)

# 결과 Median Filter 적용 사이즈 설정
i32FilterSize = 5
stereoDisparity3D.SetFilterSize(i32FilterSize)

# 미확실 결과 영역 출력 여부 설정
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();
// 객체 생성
CStereoDisparity3D stereoDisparity3D = new CStereoDisparity3D();

// Minimum Disparity 설정합니다.
int i32SetMinimumDisparity = -100;
stereoDisparity3D.SetMinimumDisparity(i32SetMinimumDisparity);

// 설정된 Minimum Disparity 가져옵니다.
int i32GetMinimumDisparity;
i32GetMinimumDisparity = stereoDisparity3D.GetMinimumDisparity();
# 객체 생성
stereoDisparity3D = CStereoDisparity3D()

# Minimum Disparity 설정합니다.
i32SetMinimumDisparity = -100
stereoDisparity3D.SetMinimumDisparity(i32SetMinimumDisparity)

# 설정된 Minimum Disparity 가져옵니다.
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();
// Maximum Disparity 설정합니다.
int i32SetMaximumDisparity = 0;
stereoDisparity3D.SetMaximumDisparity(i32SetMaximumDisparity);

// 설정된 Maximum Disparity 가져옵니다.
int i32GetMaximumDisparity;
i32GetMaximumDisparity = stereoDisparity3D.GetMaximumDisparity();
# Maximum Disparity 설정합니다.
i32SetMaximumDisparity = 0
stereoDisparity3D.SetMaximumDisparity(i32SetMaximumDisparity)

# 설정된 Maximum Disparity 가져옵니다.
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();
// Match Block Size를 설정합니다.
int i32SetMatchBlockSize = 5;
stereoDisparity3D.SetMatchBlockSize(i32SetMatchBlockSize);

// 설정된 Match Block Size를 가져옵니다.
int i32GetMatchBlockSize;
i32GetMatchBlockSize = stereoDisparity3D.GetMatchBlockSize();
# Match Block Size를 설정합니다.
i32SetMatchBlockSize = 5
stereoDisparity3D.SetMatchBlockSize(i32SetMatchBlockSize)

# 설정된 Match Block Size를 가져옵니다.
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();
// Maximum Difference를 설정합니다.
int i32SetMaximumDifference = 30;
stereoDisparity3D.SetMaximumDifference(i32SetMaximumDifference);

// 설정된 Maximum Difference를 가져옵니다.
int i32GetMaximumDifference;
i32GetMaximumDifference = stereoDisparity3D.GetMaximumDifference();
# Maximum Difference를 설정합니다.
i32SetMaximumDifference = 30
stereoDisparity3D.SetMaximumDifference(i32SetMaximumDifference)

# 설정된 Maximum Difference를 가져옵니다.
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();
// Uniqueness Ratio를 설정합니다.
double f64SetUniquenessRatio = 0.0;
stereoDisparity3D.SetUniquenessRatio(f64SetUniquenessRatio);

// 설정된 Uniqueness Ratio를 가져옵니다.
double f64GetUniquenessRatio;
f64GetUniquenessRatio = stereoDisparity3D.GetUniquenessRatio();
# Uniqueness Ratio를 설정합니다.
f64SetUniquenessRatio = 0
stereoDisparity3D.SetUniquenessRatio(f64SetUniquenessRatio)

# 설정된 Uniqueness Ratio를 가져옵니다.
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();
// P1을 설정합니다.
double f64SetP1 = 200.0;
stereoDisparity3D.SetP1(f64SetP1);

// 설정된 P1을 가져옵니다.
double f64GetP1;
f64GetP1 = stereoDisparity3D.GetP1();
# P1을 설정합니다.
f64SetP1 = 200.0
stereoDisparity3D.SetP1(f64SetP1)

# 설정된 P1을 가져옵니다.
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();
// P2를 설정합니다.
double f64SetP2 = 800.0;
stereoDisparity3D.SetP2(f64SetP2);

// 설정된 P2를 가져옵니다.
double f64GetP2;
f64GetP2 = stereoDisparity3D.GetP2();
# P2를 설정합니다.
f64SetP2 = 800.0
stereoDisparity3D.SetP2(f64SetP2)

# 설정된 P2를 가져옵니다.
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();
// Median Filter Size를 설정합니다.
int i32SetFilterSize = 5;
stereoDisparity3D.SetFilterSize(i32SetFilterSize);

// 설정된 Median Filter Size를 가져옵니다.
int i32GetFilterSize;
i32GetFilterSize = stereoDisparity3D.GetFilterSize();
# Median Filter Size를 설정합니다.
i32SetFilterSize = 5
stereoDisparity3D.SetFilterSize(i32SetFilterSize)

# 설정된 Median Filter Size를 가져옵니다.
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();
// 너비 자동 설정 여부를 선택합니다.
bool bSetAutoAdjustWidth = false;
stereoDisparity3D.EnableAutoAdjustWidth(bSetAutoAdjustWidth);

// 너비 자동 설정 여부를 가져옵니다.
bool bGetAutoAdjustWidth;
bGetAutoAdjustWidth = stereoDisparity3D.IsAutoAdjustWidthEnabled();
# 너비 자동 설정 여부를 선택합니다.
bSetAutoAdjustWidth = False
stereoDisparity3D.EnableAutoAdjustWidth(bSetAutoAdjustWidth)

# 너비 자동 설정 여부를 가져옵니다.
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();
// Height Coefficient를 설정합니다.
double f64SetHeightCoefficient = 100.0;
stereoDisparity3D.SetHeightCoefficient(f64SetHeightCoefficient);

// 설정된 Height Coefficient를 가져옵니다.
double f64GetHeightCoefficient;
f64GetHeightCoefficient = stereoDisparity3D.GetHeightCoefficient();
# Height Coefficient를 설정합니다.
f64SetHeightCoefficient = 100.0
stereoDisparity3D.SetHeightCoefficient(f64SetHeightCoefficient)

# 설정된 Height Coefficient를 가져옵니다.
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.