Perspective Merge 3D

1 개요

기준 위치에 대해 여러 개의 카메라의 위치 및 각도에 의해 생성된 정점들을 하나의 정보로 합치는 알고리즘

2 알고리즘 상세 설명

Source Data Result Data
Source Data
Source Data
Result Data
하나의 카메라는 제한된 화각으로 인해 넓은 범위의 정보를 습득할 수 없습니다.

하지만 이 알고리즘을 이용하여 서로 엇갈리게 설정한 여러 카메라가 나타낸 정점 정보들을 기준이 되는 지점에서 바라볼 때 나타나는 정점 정보로 변환 및 합침으로써 카메라 화각 이상의 넓은 범위의 정보를 취득할 수 있습니다. AMR, AGV 등에 여러 개의 카메라가 적용된 장비에 적용 가능하여 더 많은 상황에 대처할 수 있습니다.

3 파라미터 설정 및 사용 방법

다음 함수를 반복 사용하여 각 카메라의 정보와 그 카메라로부터 얻은 정보를 등록합니다.

이후 다음 함수를 통해 좌표 정보가 병합된 하나의 객체를 얻어올 수 있습니다.

계산 과정에서 어느 정보를 보존하고 어느 정보를 버리는지를 지정할 수 있습니다.

4 예제 코드

CPerspectiveMerge3D perspectiveMerge3D;

CFL3DObject floSource0;
floSource0.Load(L"C:/Users/Public/Documents/FLImaging/ExampleImages/PerspectiveMerge3D/Left Cam.ply");
TPoint3<float> tpPosition0(-0.153500f, 0.000000f, 0.000000f);
TPoint3<float> tpRotation0(90.000000f, -8.000000f, 29.000000f);
perspectiveMerge3D.AddSourceObject(floSource0, tpPosition0, tpRotation0);
CFL3DObject floSource1;
floSource1.Load(L"C:/Users/Public/Documents/FLImaging/ExampleImages/PerspectiveMerge3D/Right Cam.ply");
TPoint3<float> tpPosition1(0.153500f, 0.000000f, 0.000000f);
TPoint3<float> tpRotation1(90.000000f, -8.000000f, -29.000000f);
perspectiveMerge3D.AddSourceObject(floSource1, tpPosition1, tpRotation1);
CFL3DObject floDestination;
perspectiveMerge3D.SetDestinationObject(floDestination);

perspectiveMerge3D.Execute();
CPerspectiveMerge3D perspectiveMerge3D = new CPerspectiveMerge3D();

CFL3DObject floSource0 = new CFL3DObject();
floSource0.Load("C:/Users/Public/Documents/FLImaging/ExampleImages/PerspectiveMerge3D/Left Cam.ply");
TPoint3<float> tpPosition0 = new TPoint3<float>(-0.153500f, 0.000000f, 0.000000f);
TPoint3<float> tpRotation0 = new TPoint3<float>(90.000000f, -8.000000f, 29.000000f);
perspectiveMerge3D.AddSourceObject(ref floSource0, tpPosition0, tpRotation0);
CFL3DObject floSource1 = new CFL3DObject();
floSource1.Load("C:/Users/Public/Documents/FLImaging/ExampleImages/PerspectiveMerge3D/Right Cam.ply");
TPoint3<float> tpPosition1 = new TPoint3<float>(0.153500f, 0.000000f, 0.000000f);
TPoint3<float> tpRotation1 = new TPoint3<float>(90.000000f, -8.000000f, -29.000000f);
perspectiveMerge3D.AddSourceObject(ref floSource1, tpPosition1, tpRotation1);
CFL3DObject floDestination = new CFL3DObject();
perspectiveMerge3D.SetDestinationObject(ref floDestination);

perspectiveMerge3D.Execute();

perspectiveMerge3D = CPerspectiveMerge3D()

floSource0 = CFL3DObject()
floSource0.Load("C:/Users/Public/Documents/FLImaging/ExampleImages/PerspectiveMerge3D/Left Cam.ply")
tpPosition0 = TPoint3[Single](-0.153500, 0.000000, 0.000000)
tpRotation0 = TPoint3[Single](90.000000, -8.000000, 29.000000)
perspectiveMerge3D.AddSourceObject(floSource0, tpPosition0, tpRotation0)
floSource1 = CFL3DObject()
floSource1.Load("C:/Users/Public/Documents/FLImaging/ExampleImages/PerspectiveMerge3D/Right Cam.ply")
tpPosition1 = TPoint3[Single](0.153500, 0.000000, 0.000000)
tpRotation1 = TPoint3[Single](90.000000, -8.000000, -29.000000)
perspectiveMerge3D.AddSourceObject(floSource1, tpPosition1, tpRotation1)
floDestination = CFL3DObject()
perspectiveMerge3D.SetDestinationObject(floDestination)

perspectiveMerge3D.Execute()