Laser Triangulation 3D
1 개요
레이저로 투사된 3차원 물체를 레이저 삼각측량법을 이용하여 3차원 이미지로 재구성하는 알고리즘입니다.
2 알고리즘 상세 설명
라인 레이저로 투사된 3차원 물체를 레이저 삼각 측량을 통해 3차원 이미지로 만들어 줍니다.
알고리즘의 입력 방식에는 Image와 Profile이 있습니다. Image는 측정 물체에 레이저를 투사한 것을 촬영한 이미지들을 소스 이미지로 하여 Processing 한 것이고 Profile은 Laser 위치에 대한 변위 값을 소스로 하여 Processing 합니다. Profile 타입의 Source는 Height 가 1인 이미지이며 각 픽셀값은 높이를 뜻합니다.
Source Image | Destination Model |
---|---|
![]() |
![]() |
각 파라미터에 대한 정보는 다음과 같습니다.
- Working Distance : 카메라 렌즈와 Reference Plane 간의 거리
- Pixel Accuracy : Pixel 당 실제 거리(mm)
- Scan Accuracy : 이미지 당 물체의 이동량(mm)
- Angle Of Laser : Laser 조사 각도 (Degrees)
- Angle Of Camera : 지면을 기준으로 카메라의 기울기 (Degrees)
Image 연산에서 카메라가 반사된 레이저를 제외한 다른 광원에 노출되는 경우 연산 결과에 오차가 발생할 수 있습니다. 낮은 Scan Accuracy와 낮은 Pixel Accuracy의 설정으로 더 정확한 결과를 얻을 수 있습니다.
3 예제 코드
다음 코드를 사용하여 Laser Triangulation을 실행할 수 있습니다.
// 객체 생성
CLaserTriangulation3D laserTriangulation3D;
// 입력 이미지 설정
CFLImage fliSourceImage;
laserTriangulation3D.SetSourceImage(fliSourceImage);
// 출력 Height Map 이미지 설정
CFLImage fliDestinationHeightMapImage;
laserTriangulation3D.SetDestinationHeightMapImage(fliDestinationHeightMapImage);
// 출력 3D Object 설정
CFL3DObjectHeightMap fl3DOHM;
laserTriangulation3D.SetDestinationObject(fl3DOHM);
// 입력되는 이미지 Type을 설정합니다.
CLaserTriangulation3D::ESourceType eSourceType = CLaserTriangulation3D::ESourceType_Image;
laserTriangulation3D.SetSourceType(eSourceType);
// 찍은 카메라의 Lens Type을 설정합니다.
CLaserTriangulation3D::ELensType eLensType = CLaserTriangulation3D::ELensType_Normal;
laserTriangulation3D.SetLensType(eLensType);
// Pixel 당 실제 거리를 설정합니다. (mm)
double f64PixelAccuracy = 1.0;
laserTriangulation3D.SetPixelAccuracy(f64PixelAccuracy);
// 이미지 당 물체의 이동량을 설정합니다. (mm)
double f64ScanAccuracy = 1.0;
laserTriangulation3D.SetScanAccuracy(f64ScanAccuracy);
// 카메라 렌즈와 Reference Plane 간의 거리를 설정합니다.
double f64WorkingDistance = 2000.0;
laserTriangulation3D.SetWorkingDistance(f64WorkingDistance);
// Laser 조사 각도를 설정합니다.
double f64AngleOfLaser = 60.0;
laserTriangulation3D.SetAngleOfLaser(f64AngleOfLaser);
// 사용된 카메라의 기울기를 설정합니다.
double f64AngleOfCamera = 90.0;
laserTriangulation3D.SetAngleOfCamera(f64AngleOfCamera);
// 결과 이미지가 사용되는 Interpolation Method를 설정합니다.
EInterpolationMethod eInterpolationMethod = EInterpolationMethod_Bilinear;
laserTriangulation3D.SetInterpolationMethod(eInterpolationMethod);
// Execution 실행
laserTriangulation3D.Execute();
4 추가 함수 설명
파라미터 설정 및 불러오기
// 객체 생성
CLaserTriangulation3D laserTriangulation3D;
// 입력되는 이미지 Type.
CLaserTriangulation3D::ESourceType eSourceType = CLaserTriangulation3D::ESourceType_Image;
// 바로 촬영된 이미지
eSourceType = CLaserTriangulation3D::ESourceType_Image;
// 미리 Profile 된 이미지
eSourceType = CLaserTriangulation3D::ESourceType_Profile;
CLaserTriangulation3D::ESourceType eSetSourceType = eSourceType;
// 이미지 형식을 설정합니다.
laserTriangulation3D.SetSourceType(eSetSourceType);
CLaserTriangulation3D::ESourceType eGetSourceType = CLaserTriangulation3D::ESourceType_Image;
// 이미지 형식을 가져옵니다.
eGetSourceType = laserTriangulation3D.GetSourceType();
CLaserTriangulation3D::ESourceType
은 LaserTriangulation3D의 알고리즘 입력 방식을 변수로 저장하는 데 사용됩니다.
함수 SetSourceType
으로 CLaserTriangulation3D::ESourceType
변수를 입력하여 알고리즘 입력 방식의 설정이 가능합니다.
함수 GetSourceType
으로 설정된 알고리즘 입력 방식을 가져올 수 있습니다.
잘못된 입력 방식을 설정할 때 치명적인 오류가 발생합니다.
Default: ESourceType_Image
// 객체 생성
CLaserTriangulation3D laserTriangulation3D;
// 입력되는 이미지 렌즈 Type.
CLaserTriangulation3D::ELensType eLensType = CLaserTriangulation3D::ELensType_Normal;
// 촬영된 이미지 렌즈 타입
eLensType = CLaserTriangulation3D::ELensType_Normal;
eLensType = CLaserTriangulation3D::ELensType_Telecentric;
CLaserTriangulation3D::ELensType eSetLensType = eLensType;
// 촬영된 이미지 렌즈 타입을 설정합니다.
laserTriangulation3D.SetLensType(eSetLensType);
CLaserTriangulation3D::ELensType eGetLensType = CLaserTriangulation3D::ELensType_Normal;
// 촬영된 이미지 렌즈 타입을 가져옵니다.
eGetLensType = laserTriangulation3D.GetLensType();
CLaserTriangulation3D::ELensType
은 LaserTriangulation3D의 알고리즘의 입력 이미지가 촬영된 카메라의 설정이 저장됩니다.
함수 SetLensType
으로 촬영 카메라 Lens의 설정이 가능합니다.
함수 GetLensType
으로 설정된 촬영 카메라 Lens를 가져올 수 있습니다.
잘못된 렌즈 타입을 설정할 때 결과 오류가 발생할 확률이 있습니다.
Default: ELensType_Normal
// 객체 생성
CLaserTriangulation3D laserTriangulation3D;
// Pixel 당 실제 거리
double f64InputPixAcc = 1.0;
// Pixel 당 실제 거리를 설정합니다.
laserTriangulation3D.SetPixelAccuracy(f64InputPixAcc);
// 설정된 Pixel 당 실제 거리를 가져옵니다.
double f64OutputPixAcc = laserTriangulation3D.GetPixelAccuracy();
함수 SetPixelAccuracy
으로 Pixel 당 실제 거리를 설정합니다.
함수 GetPixelAccuracy
으로 설정된 Pixel 당 실제 거리를 가져올 수 있습니다.
거리는 mm 단위 기준으로 설정됩니다.
잘못된 값을 설정할 때 결과 오류가 발생할 확률이 있습니다.
// 객체 생성
CLaserTriangulation3D laserTriangulation3D;
// 이미지 당 물체의 이동량
double f64InputScanAcc = 1.0;
// 이미지 당 물체의 이동량을 설정합니다.
laserTriangulation3D.SetScanAccuracy(f64InputScanAcc);
// 설정된 이미지 당 물체의 이동량을 가져옵니다.
double f64OutputScanAcc = laserTriangulation3D.GetScanAccuracy();
함수 SetScanAccuracy
으로 이미지 당 물체의 이동량을 설정합니다.
함수 GetScanAccuracy
으로 설정된 이미지 당 물체의 이동량을 가져올 수 있습니다.
거리는 mm 단위 기준으로 설정됩니다.
잘못된 값을 설정할 때 결과 오류가 발생할 확률이 있습니다.
// 객체 생성
CLaserTriangulation3D laserTriangulation3D;
// 카메라 렌즈와 Reference Plane 간의 거리
double f64InputWorkDist = 2000.0;
// 카메라 렌즈와 Reference Plane 간의 거리를 설정합니다.
laserTriangulation3D.SetWorkingDistance(f64InputWorkDist);
// 카메라 렌즈와 Reference Plane 간의 거리를 가져옵니다.
double f64OutputWorkDist = laserTriangulation3D.GetWorkingDistance();
함수 SetWorkingDistance
으로 카메라 렌즈와 Reference Plane 간의 거리를 설정합니다.
함수 GetWorkingDistance
으로 설정된 카메라 렌즈와 Reference Plane 간의 거리를 가져올 수 있습니다.
거리는 mm 단위 기준으로 설정됩니다.
잘못된 값을 설정할 때 결과 오류가 발생할 확률이 있습니다.
// 객체 생성
CLaserTriangulation3D laserTriangulation3D;
// Laser 조사 각도
double f64InputAngLaser = 60.0;
// Laser 조사 각도를 설정합니다.
laserTriangulation3D.SetAngleOfLaser(f64InputAngLaser);
// Laser 조사 각도를 가져옵니다.
double f64OutputAngLaser = laserTriangulation3D.GetAngleOfLaser();
함수 SetAngleOfLaser
로 Laser 조사 각도를 설정합니다.
함수 GetAngleOfLaser
로 설정된 Laser 조사 각도를 가져올 수 있습니다.
각도는 Degree를 기준으로 설정됩니다.
잘못된 값을 설정할 때 결과 오류가 발생할 확률이 있습니다.
// 객체 생성
CLaserTriangulation3D laserTriangulation3D;
// 평면 기준 카메라의 각도
double f64InputAngCam = 90;
// 카메라의 각도를 설정합니다.
laserTriangulation3D.SetAngleOfCamera(f64InputAngCam);
// 카메라의 각도를 가져옵니다.
double f64OutputAngCam = laserTriangulation3D.GetAngleOfCamera();
함수 SetAngleOfCamera
로 평면 기준 카메라의 각도를 설정합니다.
함수 GetAngleOfCamera
로 설정된 평면 기준 카메라의 각도를 거리를 가져올 수 있습니다.
각도는 Degree를 기준으로 설정이 되고 90으로 설정 시 바닥을 향해 있습니다.
잘못된 값을 설정할 때 결과 오류가 발생할 확률이 있습니다.
// 객체 생성
CLaserTriangulation3D laserTriangulation3D;
// 평면 기준 카메라의 각도
EInterpolationMethod eInputInterMethod = EInterpolationMethod::Bilinear;
// 평면 기준 카메라의 각도
EInterpolationMethod eInputInterMethod;
// Bilinear 보간법
eInterMethod = EInterpolationMethod_Bilinear;
// Nearest Neighbor 보간법
eInterMethod = EInterpolationMethod_NearestNeighbor;
// Bicubic 보간법
eInterMethod = EInterpolationMethod_Bicubic;
// Lanczos 보간법
eInterMethod = EInterpolationMethod_Lanczos;
// 카메라의 각도를 설정합니다.
laserTriangulation3D.SetInterpolationMethod(eInputInterMethod);
// 카메라의 각도를 가져옵니다.
EInterpolationMethod eOutputInterMethod = laserTrianglulation.GetInterpolationMethod();
함수 SetInterpolationMethod
으로 결과 Height Map에 사용할 보간법을 설정합니다.
함수 GetInterpolationMethod
으로 설정된 보간법을 가져올 수 있습니다.
Default: EInterpolationMethod_Bilinear