Camera Pose 3D

1 개요

Calibration Object를 촬영한 카메라의 위치 및 방향 정보(Camera Pose)를 카메라 내부 파라미터를 사용해 계산하며, 이미지의 중심을 Calibration Object 좌표계의 원점으로 가정한 포즈를 반환합니다.

(Fx0Px 0FyPy 001)\begin{pmatrix} Fx & 0 & Px \\\ 0 & Fy & Py \\\ 0 & 0 & 1 \\ \end{pmatrix}

P(x,y):PrincipalPoint(Intrinsic) F(x,y):FocalLength(Intrinsic) P(x, y) : Principal Point(Intrinsic) \\\ F(x, y) : Focal Length(Intrinsic)

(R11R12R13T1 R21R22R23T2 R31R32R33T3 0001)\begin{pmatrix} R11 & R12 & R13 & T1 \\\ R21 & R22 & R23 & T2 \\\ R31 & R32 & R33 & T3 \\\ 0 & 0 & 0 & 1 \\ \end{pmatrix}

R:RotationMatrix(Extrinsic) T:TranslationVector(Extrinsic) R : Rotation Matrix(Extrinsic) \\\ T : Translation Vector(Extrinsic)

2 알고리즘 상세 설명

Calibration Object Result Camera Pose
Calibration Board Camera Pose Result
Fig. Calibration Board, Camera Pose 3D Result

3 파라미터 설정

4 알고리즘 수행 결과 및 취득 방법

5 예제 코드

CCameraPose3D CameraPose3D;

CFLImage fliSourceImage;

fliSourceImage.Load(L"C:/Users/Public/Documents/FLImaging/ExampleImages/CameraPose3D/ChessBoard(9).flif");
CameraPose3D.SetSourceImage(fliSourceImage);
CameraPose3D.SetCalibrationObjectType(ThreeDim::ECalibrationObjectType::ECalibrationObjectType_ChessBoard); // 캘리브레이션 객체 타입을 체스보드로 설정

CFLPoint<double> flpFocalLength; 
CFLPoint<double> flpPrincipalPoint;
flpFocalLength.x = 428.668823; 
flpFocalLength.y = 428.268188;
flpPrincipalPoint.x = 422.934998; 
flpPrincipalPoint.y = 240.188660;	
CameraPose3D.SetCameraMatrix(flpPrincipalPoint, flpFocalLength); // 카메라 내부 행렬 설정

CFLArray<double> flaDistortionCoef;
flaDistortionCoef.PushBack(-0.053853);
laDistortionCoef.PushBack(-0.053853);
flaDistortionCoef.PushBack(0.000375);
flaDistortionCoef.PushBack(0.000786);
flaDistortionCoef.PushBack(-0.018948);
CameraPose3D.SetDistortionCoefficient(flaDistortionCoef); // 왜곡 계수 설정
CameraPose3D.SetBoardCellPitch(5.000000, 5.000000); // 체스 보드 셀 간격 설정
CameraPose3D.Execute();

CCameraPose3D CameraPose3D = new CCameraPose3D();
CFLImage fliSourceImage = new CFLImage();
fliSourceImage.Load("C:/Users/Public/Documents/FLImaging/ExampleImages/CameraPose3D/ChessBoard(9).flif");
CameraPose3D.SetSourceImage(ref fliSourceImage);

CameraPose3D.SetCalibrationObjectType(ECalibrationObjectType.ChessBoard); // 캘리브레이션 객체 타입을 체스보드로 설정
CFLPoint<double> flpFocalLength = new CFLPoint<double>();
CFLPoint<double> flpPrincipalPoint = new CFLPoint<double>();
flpFocalLength.x = 428.668823; 
flpFocalLength.y = 428.268188;
flpPrincipalPoint.x = 422.934998; 
flpPrincipalPoint.y = 240.188660;	
CameraPose3D.SetCameraMatrix(flpPrincipalPoint, flpFocalLength); // 카메라 내부 행렬 설정
List<double> listDistortionCoef = new List<double>();
listDistortionCoef.Add(-0.053853);
listDistortionCoef.Add(-0.053853);
listDistortionCoef.Add(0.000375);
listDistortionCoef.Add(0.000786);
listDistortionCoef.Add(-0.018948);
CameraPose3D.SetDistortionCoefficient(listDistortionCoef); 왜곡 계수 설정
CameraPose3D.SetBoardCellPitch(5.000000, 5.000000); // 체스 보드 셀 간격 설정
CameraPose3D.Execute();

CameraPose3D = CCameraPose3D()
fliSourceImage = CFLImage()
fliSourceImage.Load("C:/Users/Public/Documents/FLImaging/ExampleImages/CameraPose3D/ChessBoard(9).flif")
CameraPose3D.SetSourceImage(fliSourceImage)

CameraPose3D.SetCalibrationObjectType(ECalibrationObjectType.ChessBoard) # 캘리브레이션 객체 타입을 체스보드로 설정
flpFocalLength = CFLPoint[Double]()
flpPrincipalPoint = CFLPoint[Double]()
flpFocalLength.x = 428.668823
flpFocalLength.y = 428.268188
flpPrincipalPoint.x = 422.934998 
flpPrincipalPoint.y = 240.188660	
CameraPose3D.SetCameraMatrix(flpPrincipalPoint, flpFocalLength) # 카메라 내부 행렬 설정
listDistortionCoef = List[Double]()
listDistortionCoef.Add(-0.053853)
listDistortionCoef.Add(-0.053853)
listDistortionCoef.Add(0.000375)
listDistortionCoef.Add(0.000786)
listDistortionCoef.Add(-0.018948)
CameraPose3D.SetDistortionCoefficient(listDistortionCoef) # 왜곡 계수 설정
CameraPose3D.SetBoardCellPitch(5.000000, 5.000000) # 체스 보드 셀 간격 설정
CameraPose3D.Execute()