Camera Pose 3D
1 개요
Calibration Object를 촬영한 카메라의 위치 및 방향 정보(Camera Pose)를 카메라 내부 파라미터를 사용해 계산하며, 이미지의 중심을 Calibration Object 좌표계의 원점으로 가정한 포즈를 반환합니다.
Fx 0 00Fy0PxPy1
P(x,y):PrincipalPoint(Intrinsic) F(x,y):FocalLength(Intrinsic)
R11 R21 R31 0R12R22R320R13R23R330T1T2T31
R:RotationMatrix(Extrinsic) T:TranslationVector(Extrinsic)
2 알고리즘 상세 설명
Calibration Object |
Result Camera Pose |
 |
 |
Fig. Calibration Board, Camera Pose 3D Result
3 파라미터 설정
-
SetCameraMatrix(CFLPoint<double> flpPrincipalPoint, CFLPoint<double> flpFocalLength)
- 카메라 내부 파라미터를 설정합니다.
- flpFocalLength, flpPrincipalPoint : 카메라의 초점 거리 및 주점
-
SetDistortionCoefficient(CFLArray<double> flaDistortionCoeff)
- 카메라 왜곡 계수를 설정합니다.
- flaDistortionCoeff : 카메라 왜곡 계수
-
SetBoardCellPitch(CFLPoint<double> flpBoardCellPitch)
- 캘리브레이션 보드의 셀 간격을 설정합니다.
- flpBoardCellPitch : 캘리브레이션 보드의 셀 간격
4 알고리즘 수행 결과 및 취득 방법
-
GetResultRotationVector(CFLArray<double> flaResultRotationVector)
-
GetResultTranslationVector(CFLArray<double> flaResultTranslationVector)
-
GetResultRotationMatrix(CMatrix<double> matResultRotationMatrix)
-
GetResultEulerAngle(Foundation::EEulerSequence, CFLArray<double> flaResultEulerAngle)
- 설정한 Euler Sequence에 맞게 Euler Angle을 얻어옵니다.
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()