Stereo Calibrator 3D
1 개요
스테레오 캘리브레이션 및 이미지 쌍 Rectification을 수행하는 알고리즘입니다.
2 알고리즘 상세 설명
패턴이 있는 보드를 스테레오 카메라로 찍은 이미지 쌍들로 스테레오 Calibration을 진행할 수 있습니다. 사용되는 이미지 쌍의 개수가 많을수록 Calibration의 오류를 줄일 수 있습니다.
현재 Calibration에 지원하는 패턴은 체스보드, 점의 격자, 십자가 격자, 직사각형 격자입니다.
Calibration 실행 후 각 카메라의 내부 및 외부 Parameter를 얻을 수 있습니다. 이렇게 추출한 스테레오 Calibration 정보로 같은 스테레오 카메라로 찍은 이미지를 정류 및 보정할 수 있습니다.
Source Left Image | Source Right Image | Destination Left Model | Destination Right Model |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
GUI에서 Calibration 실행 이후 각 카메라의 Parameter를 확인할 수 있습니다.
3 예제 코드
다음 코드로 기본 설정 및 Calibration 진행이 가능합니다.
// 객체 생성
CStereoCalibrator3D stereoCalibrator3D;
// 첫 입력 이미지 설정
CFLImage fliLearnImage;
stereoCalibrator3D.SetLearnImage(fliLearnImage);
// 두 번째 입력 이미지 설정
CFLImage fliLearnImage2;
stereoCalibrator3D.SetLearnImage2(fliLearnImage2);
// 결과 목표 정확도 설정
double f64OptimalSolAcc = 0.00001;
stereoCalibrator3D.SetOptimalSolutionAccuracy(f64OptimalSolAcc);
// Calibration에 사용되는 Type 설정
CStereoCalibrator3D::EGridType eGridType = CStereoCalibrator3D::EGridType_ChessBoard;
stereoCalibrator3D.SetGridType(eGridType);
// Calibrate 진행
stereoCalibrator3D.Calibrate();
다음 코드는 Calibrate 한 모델에 각 이미지의 Grid를 얻어 오는 코드입니다.
// Grid 객체 정의
struct SGridDisplay
{
// 이미지 번호
int64_t i64ImageIdx;
// 점 번호
int64_t i64ObjectIdx;
// 보드 정보
CStereoCalibrator3D::SGridResult sGridData;
};
// 객체 생성
CStereoCalibrator3D stereoCalibrator3D;
// 이미지의 페이지 수 저장
int64_t i64ImagePageCount = stereoCalibrator3D.GetLearnImage()->GetPageCount();
for(int64_t i64ImgIdx = 0; i64ImgIdx < i64ImagePageCount; ++i64ImgIdx)
{
// 보드 정보 저장
SGridDisplay sGridDisplay1;
SGridDisplay sGridDisplay2;
stereoCalibrator3D.GetResultGridPoints(&sGridDisplay1.sGridData, i64ImgIdx);
stereoCalibrator3D.GetResultGridPoints2(&sGridDisplay2.sGridData, i64ImgIdx);
sGridDisplay1.i64ImageIdx = i64ImgIdx;
sGridDisplay2.i64ImageIdx = i64ImgIdx;
}
다음 코드는 Calibrate 이후 같은 카메라로 찍은 이미지를 Rectify 하는 코드입니다.
// 객체 생성
CStereoCalibrator3D stereoCalibrator3D;
// 첫 번째 Rectify 할 이미지 설정
CFLImage fliSourceImage;
stereoCalibrator3D.SetSourceImage(fliSourceImage);
// 두 번째 Rectify 할 이미지 설정
CFLImage fliSourceImage2;
stereoCalibrator3D.SetSourceImage2(fliSourceImage2);
// 첫 번째 결과 이미지 설정
CFLImage fliDestinationImage;
stereoCalibrator3D.SetDestinationImage(fliDestinationImage);
// 두 번째 결과 이미지 설정
CFLImage fliDestinationImage2;
stereoCalibrator3D.SetDestinationImage2(fliDestinationImage2);
// Batch Processing 설정
bool bBatchProcessing = false;
stereoCalibrator3D.EnableBatchProcessing(bBatchProcessing);
// Interpolation Method 설정
EInterpolationMethod eInterMethod = EInterpolationMethod_Bicubic;
stereoCalibrator3D.SetInterpolationMethod(eInterMethod);
// 알고리즘 실행
stereoCalibrator3D.Execute();
다음 코드로 Calibrate 한 Parameter를 사용하여 로드가 가능합니다.
// 객체 생성
CStereoCalibrator3D stereoCalibrator3D;
// 데이터 파일 위치
CFLString<wchar_t> cStrLoad;
// 데이터 불러오기
stereoCalibrator3D.Load(cStrLoad);
4 추가 함수 설명
Calibration 전 파라미터 설정 및 가져오기
// 객체 생성
CStereoCalibrator3D stereoCalibrator3D;
// 입력되는 이미지 Type
CStereoCalibrator3D::EGridType eGridType = CStereoCalibrator3D::EGridType_ChessBoard;
// 체스보드 타입
eGridType = CStereoCalibrator3D::EGridType_ChessBoard;
// 격자 점판 타입
eGridType = CStereoCalibrator3D::EGridType_GridOfDots;
// 격자 십자가 타입
eGridType = CStereoCalibrator3D::EGridType_GridOfCross;
// 격자 사각형 타입
eGridType = CStereoCalibrator3D::EGridType_GridOfRectangle;
CStereoCalibrator3D::EGridType eSetGridType = eGridType;
// Calibration 이미지 형식을 설정합니다.
stereoCalibrator3D.SetGridType(eSetGridType);
CStereoCalibrator3D::EGridType eGetGridType = eGridType;
// Calibration 이미지 형식을 가져옵니다.
eGetGridType = stereoCalibrator3D.GetGridType();
CStereoCalibrator3D::EGridType
은 CStereoCalibrator3D 알고리즘의 Calibration에 사용되는 패턴의 설정이 저장됩니다.
함수 SetGridType
으로 입력 패턴의 설정이 가능합니다.
함수 GetGridType
으로 설정된 입력 패턴을 가져올 수 있습니다.
잘못된 패턴을 설정할 때 함수가 동작하지 않거나 결과 오류가 발생할 확률이 높습니다.
Default: EGridType_ChessBoard
// 객체 생성
CStereoCalibrator3D stereoCalibrator3D;
// 설정된 Optimal Solution Accuracy를 가져옵니다.
double f64GetOptimalSolutionAcc = stereoCalibrator3D.GetOptimalSolutionAccuracy();
함수 GetOptimalSolutionAccuracy
로 설정된 Optimal Solution Accuracy를 가져올 수 있습니다.
// 객체 생성
CStereoCalibrator3D stereoCalibrator3D;
// 보정 전 좌표
CFLPoint<double> cFLPointDInput;
// 보정 후 좌표
CFLPoint<double> cFLPointDOutput;
// 카메라1을 기준으로 보정되지 않은 좌표 값 변환
stereoCalibrator3D.ConvertCoordinate(cFLPointDInput, cFLPointDOutput);
// 카메라2을 기준으로 보정되지 않은 좌표 값 변환
stereoCalibrator3D.ConvertCoordinate2(cFLPointDInput, cFLPointDOutput);
함수 ConvertCoordinate
, ConvertCoordinate2
로 보정된 좌푯값이 보정되지 않은 좌푯값으로 반환합니다.
잘못된 패턴을 설정할 때 함수가 동작하지 않거나 결과 오류가 발생할 확률이 높습니다.
// 객체 생성
CStereoCalibrator3D stereoCalibrator3D;
// Calibrate의 여부 확인
bool bCalib = stereoCalibrator3D.IsCalibrated();
함수 IsCalibrated
으로 Calibrate 실행의 여부를 확인할 수 있습니다.
해당 변수가 False인 경우 Execute 실행 시 오류를 반환합니다.
// 객체 생성
CStereoCalibrator3D stereoCalibrator3D;
// Calibrate의 Reprojection Error 출력
double f64ResultReprojectErr = stereoCalibrator3D.GetResultReProjectionError();
함수 GetResultReProjectionError
로 재투영 오류 값을 확인할 수 있습니다.
Execute 전 파라미터 설정 및 가져오기
// 객체 생성
CStereoCalibrator3D stereoCalibrator3D;
// Interpolation Method 변수
EInterpolationMethod eInterMethod = EInterpolationMethod_Bilinear;
// 쌍선형(Bilinear) 보간법
eInterMethod = EInterpolationMethod_Bilinear;
// 최근접(Nearest neighbor) 보간법
eInterMethod = EInterpolationMethod_NearestNeighbor;
// 쌍입방(Bicubic) 보간법
eInterMethod = EInterpolationMethod_Bicubic;
// Lanczos 보간법
eInterMethod = EInterpolationMethod_Lanczos;
// 보간법을 설정합니다.
stereoCalibrator3D.SetInterpolationMethod(eInterMethod);
// 설정된 보간법을 가져옵니다.
EInterpolationMethod eGetInterMethod = stereoCalibrator3D.GetInterpolationMethod();
함수 SetInterpolationMethod
으로 Optimal Solution Accuracy의 설정이 가능합니다.
함수 GetInterpolationMethod
으로 설정된 Optimal Solution Accuracy를 가져올 수 있습니다.
잘못된 패턴을 설정할 때 함수가 동작하지 않거나 결과 오류가 발생할 확률이 높습니다.
// 객체 생성
CStereoCalibrator3D stereoCalibrator3D;
// 카메라 Intrinsic Parameter 변수
CStereoCalibrator3D::SIntrinsicParameters sIntrinsicParam;
// 카메라의 X 초점 거리
double f64FocalLengthX = 1200;
// 카메라의 Y 초점 거리
double f64FocalLengthY = 1200;
// 카메라의 X 주점
double f64PrincipalPointX = 960;
// 카메라의 Y 주점
double f64PrincipalPointY = 540;
// 비대칭 계수
double f64Skew = 0;
// 카메라의 X 초점 거리 설정
sIntrinsicParam.f64FocalLengthX = f64FocalLengthX;
// 카메라의 Y 초점 거리 설정
sIntrinsicParam.f64FocalLengthY = f64FocalLengthY;
// 카메라의 X 주점 설정
sIntrinsicParam.f64PrincipalPointX = f64PrincipalPointX;
// 카메라의 Y 주점 설정
sIntrinsicParam.f64PrincipalPointY = f64PrincipalPointY;
// 비대칭 계수 설정
sIntrinsicParam.f64Skew = f64Skew;
// 카메라1 Intrinsic Parameters을 설정합니다.
stereoCalibrator3D.SetIntrinsicParameters(sIntrinsicParam);
// 카메라2 Intrinsic Parameters을 설정합니다.
stereoCalibrator3D.SetIntrinsicParameters2(sIntrinsicParam);
// 카메라1 Intrinsic Parameters을 가져옵니다.
CStereoCalibrator3D::SIntrinsicParameters sGetIntrinsicParam1 = stereoCalibrator3D.GetResultIntrinsicParameters();
// 카메라2 Intrinsic Parameters을 가져옵니다.
CStereoCalibrator3D::SIntrinsicParameters sGetIntrinsicParam2 = stereoCalibrator3D.GetResultIntrinsicParameters2();
함수 SetIntrinsicParameters
, SetIntrinsicParameters2
로 두 카메라의 Intrinsic Parameter의 설정이 가능합니다.
함수 GetResultIntrinsicParameters
, GetResultIntrinsicParameters2
로 설정된 두 카메라의 Intrinsic Parameter를 가져올 수 있습니다.
잘못된 패턴을 설정할 때 함수가 동작하지 않거나 결과 오류가 발생할 확률이 높습니다.
// 객체 생성
CStereoCalibrator3D stereoCalibrator3D;
// 카메라 Distortion Coefficients 변수
CStereoCalibrator3D::SDistortionCoefficients sDistortionCoeff;
// 카메라의 Distortion 계수 K1
double f64K1 = 0;
// 카메라의 Distortion 계수 K2
double f64K2 = 0;
// 카메라의 Distortion 계수 K3
double f64K3 = 0;
// 카메라의 Distortion 계수 K4
double f64K4 = 0;
// 카메라의 Distortion 계수 K5
double f64K5 = 0;
// 카메라의 Distortion 계수 K6
double f64K6 = 0;
// 카메라의 Distortion 계수 P1
double f64P1 = 0;
// 카메라의 Distortion 계수 P2
double f64P2 = 0;
// 카메라의 Distortion 계수 S1
double f64S1 = 0;
// 카메라의 Distortion 계수 S2
double f64S2 = 0;
// 카메라의 Distortion 계수 S3
double f64S3 = 0;
// 카메라의 Distortion 계수 S4
double f64S4 = 0;
// 카메라의 Distortion Coefficients Gx
double f64Gx = 0;
// 카메라의 Distortion Coefficients Gy
double f64Gy = 0;
// 카메라의 Distortion 계수 K1 설정
sDistortionCoeff.f64K1 = f64K1;
// 카메라의 Distortion 계수 K2 설정
sDistortionCoeff.f64K2 = f64K2;
// 카메라의 Distortion 계수 K3 설정
sDistortionCoeff.f64K3 = f64K3;
// 카메라의 Distortion 계수 K4 설정
sDistortionCoeff.f64K4 = f64K4;
// 카메라의 Distortion 계수 K5 설정
sDistortionCoeff.f64K5 = f64K5;
// 카메라의 Distortion 계수 K6 설정
sDistortionCoeff.f64K6 = f64K6;
// 카메라의 Distortion 계수 P1 설정
sDistortionCoeff.f64P1 = f64P1;
// 카메라의 Distortion 계수 P2 설정
sDistortionCoeff.f64P2 = f64P2;
// 카메라의 Distortion 계수 S1 설정
sDistortionCoeff.f64S1 = f64S1;
// 카메라의 Distortion 계수 S2 설정
sDistortionCoeff.f64S2 = f64S2;
// 카메라의 Distortion 계수 S3 설정
sDistortionCoeff.f64S3 = f64S3;
// 카메라의 Distortion 계수 S4 설정
sDistortionCoeff.f64S4 = f64S4;
// 카메라의 Distortion Coefficients Gx 설정
sDistortionCoeff.f64Gx = f64Gx;
// 카메라의 Distortion Coefficients Gy 설정
sDistortionCoeff.f64Gy = f64Gy;
// 카메라1 Distortion 계수을 설정합니다.
stereoCalibrator3D.SetDistortionCoefficients(sDistortionCoeff);
// 카메라2 Distortion 계수을 설정합니다.
stereoCalibrator3D.SetDistortionCoefficients2(sDistortionCoeff);
// 카메라1 Distortion 계수을 가져옵니다.
CStereoCalibrator3D::SDistortionCoefficients sGetDistortionCoeff1 = stereoCalibrator3D.GetResultDistortionCoefficients();
// 카메라2 Distortion 계수을 가져옵니다.
CStereoCalibrator3D::SDistortionCoefficients sGetDistortionCoeff2 = stereoCalibrator3D.GetResultDistortionCoefficients2();
함수 SetDistortionCoefficients
, SetDistortionCoefficients2
로 두 카메라의 Distortion 계수의 설정이 가능합니다.
함수 GetResultDistortionCoefficients
, GetResultDistortionCoefficients2
로 설정된 두 카메라의 Distortion 계수를 가져올 수 있습니다.
잘못된 패턴을 설정할 때 함수가 동작하지 않거나 결과 오류가 발생할 확률이 높습니다.
// 객체 생성
CStereoCalibrator3D stereoCalibrator3D;
// 카메라 Rotation Parameters 변수
CStereoCalibrator3D::SRotationParameters sRotParam;
// 카메라의 Rotation Parameters R0
double f64R0 = 1;
// 카메라의 Rotation Parameters R1
double f64R1 = 0;
// 카메라의 Rotation Parameters R2
double f64R2 = 0;
// 카메라의 Rotation Parameters R3
double f64R3 = 0;
// 카메라의 Rotation Parameters R4
double f64R4 = 1;
// 카메라의 Rotation Parameters R5
double f64R5 = 0;
// 카메라의 Rotation Parameters R6
double f64R6 = 0;
// 카메라의 Rotation Parameters R7
double f64R7 = 0;
// 카메라의 Rotation Parameters R8
double f64R8 = 1;
// 카메라의 Rotation Parameters R0 설정
sRotParam.f64R0 = f64R0;
// 카메라의 Rotation Parameters R1 설정
sRotParam.f64R1 = f64R1;
// 카메라의 Rotation Parameters R2 설정
sRotParam.f64R2 = f64R2;
// 카메라의 Rotation Parameters R3 설정
sRotParam.f64R3 = f64R3;
// 카메라의 Rotation Parameters R4 설정
sRotParam.f64R4 = f64R4;
// 카메라의 Rotation Parameters R5 설정
sRotParam.f64R5 = f64R5;
// 카메라의 Rotation Parameters R6 설정
sRotParam.f64R6 = f64R6;
// 카메라의 Rotation Parameters R7 설정
sRotParam.f64R7 = f64R7;
// 카메라의 Rotation Parameters R8 설정
sRotParam.f64R8 = f64R8;
// 카메라1 Rotation Parameters을 설정합니다.
stereoCalibrator3D.SetRotationParameters(sRotParam);
// 카메라2 Rotation Parameters을 설정합니다.
stereoCalibrator3D.SetRotationParameters2(sRotParam);
// 카메라1 Rotation Parameters을 가져옵니다.
CStereoCalibrator3D::SRotationParameters sGetRotParam1 = stereoCalibrator3D.GetResultRotationParameters();
// 카메라2 Rotation Parameters을 가져옵니다.
CStereoCalibrator3D::SRotationParameters sGetRotParam2 = stereoCalibrator3D.GetResultRotationParameters2();
함수 SetRotationParameters
, SetRotationParameters2
로 두 카메라의 Rotation Parameter의 설정이 가능합니다.
함수 GetResultRotationParameters
, GetResultRotationParameters2
로 설정된 두 카메라의 Rotation Parameter를 가져올 수 있습니다.
잘못된 패턴을 설정할 때 함수가 동작하지 않거나 결과 오류가 발생할 확률이 높습니다.
// 객체 생성
CStereoCalibrator3D stereoCalibrator3D;
// 카메라 Translation Parameters 변수
CStereoCalibrator3D::STranslationParameters sTransParam;
// 카메라의 Translation Parameters T0
double f64T0 = 0;
// 카메라의 Translation Parameters T1
double f64T1 = 0;
// 카메라의 Translation Parameters T2
double f64T2 = 0;
// 카메라의 Translation Parameters T3
double f64T3 = 0;
// 카메라의 Translation Parameters T4
double f64T4 = 0;
// 카메라의 Translation Parameters T5
double f64T5 = 0;
// 카메라의 Translation Parameters T6
double f64T6 = 0;
// 카메라의 Translation Parameters T7
double f64T7 = 0;
// 카메라의 Translation Parameters T8
double f64T8 = 0;
// 카메라의 Translation Parameters T9
double f64T9 = 0;
// 카메라의 Translation Parameters T10
double f64T10 = 0;
// 카메라의 Translation Parameters T11
double f64T11 = 0;
// 카메라의 Translation Parameters T0 설정
sTransParam.f64T0 = f64T0;
// 카메라의 Translation Parameters T1 설정
sTransParam.f64T1 = f64T1;
// 카메라의 Translation Parameters T2 설정
sTransParam.f64T2 = f64T2;
// 카메라의 Translation Parameters T3 설정
sTransParam.f64T3 = f64T3;
// 카메라의 Translation Parameters T4 설정
sTransParam.f64T4 = f64T4;
// 카메라의 Translation Parameters T5 설정
sTransParam.f64T5 = f64T5;
// 카메라의 Translation Parameters T6 설정
sTransParam.f64T6 = f64T6;
// 카메라의 Translation Parameters T7 설정
sTransParam.f64T7 = f64T7;
// 카메라의 Translation Parameters T8 설정
sTransParam.f64T8 = f64T8;
// 카메라의 Translation Parameters T9 설정
sTransParam.f64T9 = f64T9;
// 카메라의 Translation Parameters T10 설정
sTransParam.f64T10 = f64T10;
// 카메라의 Translation Parameters T11 설정
sTransParam.f64T11 = f64T11;
// 카메라1 Translation Parameters을 설정합니다.
stereoCalibrator3D.SetTranslationParameters(sTransParam);
// 카메라2 Translation Parameters을 설정합니다.
stereoCalibrator3D.SetTranslationParameters2(sTransParam);
// 카메라1 Translation Parameters을 가져옵니다.
CStereoCalibrator3D::STranslationParameters sGetTransParam1 = stereoCalibrator3D.GetResultTranslationParameters();
// 카메라2 Translation Parameters을 가져옵니다.
CStereoCalibrator3D::STranslationParameters sGetTransParam2 = stereoCalibrator3D.GetResultTranslationParameters2();
함수 SetTranslationParameters
, SetTranslationParameters2
로 두 카메라의 Translation Parameter의 설정이 가능합니다.
함수 GetResultTranslationParameters
, GetResultTranslationParameters2
로 설정된 두 카메라의 Translation Parameter를 가져올 수 있습니다.
잘못된 패턴을 설정할 때 함수가 동작하지 않거나 결과 오류가 발생할 확률이 높습니다.
// 객체 생성
CStereoCalibrator3D stereoCalibrator3D;
// 카메라 1 결과 Grid Result을 가져옵니다.
CStereoCalibrator3D::SGridResult sGetGridPoint;
int64_t i64ImagePage = 0;
stereoCalibrator3D.GetResultGridPoints(&sGetGridPoint, i64ImagePage);
// 카메라 2 결과 Grid Result을 가져옵니다.
CStereoCalibrator3D::SGridResult sGetGridPoint2;
int64_t i64ImagePage2 = 0;
stereoCalibrator3D.GetResultGridPoints2(&sGetGridPoint2, i64ImagePage2);
함수 GetResultGridPoints
, GetResultGridPoints2
로 설정된 두 카메라의 Grid Result를 가져올 수 있습니다.
// 객체 생성
CStereoCalibrator3D stereoCalibrator3D;
// 파일 위치
CFLString<wchar_t> wStrPath;
// 해당 위치에 Parameter 파일 저장
stereoCalibrator3D.Save(wStrPath);
// 해당 위치에 있는 Parameter 파일 불러오기
stereoCalibrator3D.Load(wStrPath);
// Major, Minor 버젼
int32_t i32MajorVer = 0;
int32_t i32MinorVer = 0;
// Parameter 저장 파일 버전 확인
stereoCalibrator3D.GetLearnedFileVersion(wStrPath, i32MajorVer, i32MinorVer);
함수 Save
로 이미 설정된 두 카메라의 Parameter를 입력한 위치에 저장할 수 있습니다.
함수 Load
로 두 카메라의 Parameter를 입력한 위치에 있는 Parameter 파일로 불러올 수 있습니다.
함수 GetLearnedFileVersion
으로 해당 위치에 있는 저장한 Parameter 파일의 버전을 가져옵니다.