Photometric Stereo 3D

1 개요

한 물체를 같은 위치에서 찍은 여러 이미지와 각 이미지에서 광원의 위치를 사용하여 Albedo, Curvature, Height Map을 구하는 알고리즘입니다.

2 알고리즘 상세 설명

Photometric Stereo는 카메라의 위치와 물체의 위치를 고정하고 광원의 위치를 바꿔가며 구한 이미지를 사용하여 3D 모델을 구하는 알고리즘입니다.


Photometric Stereo의 광원 위치 입력하는 방식에 여러 방식이 있습니다.

Position(XYZ) Diagram Slant Diagram Tilt Diagram
Source Image Calibration Image Destination Image
Fig. Position, Slant, Tilt Diagram


Photometric Stereo는 총 3개의 출력을 가집니다.


Photometric Stereo는 Calibration을 사용하여 광원의 위치 설정이 가능합니다.

Source Image Calibration Image Destination Image
Source Image Calibration Image Destination Image
Fig. Source, Calibration and Destination Images


모든 Slant, Tilt / X, Y, Z 값을 직접 코드에 적어 넣는 방식보다는 CSV 파일을 CMatrix에 로드하여 이를 Photometric Stereo의 입력으로 간단한 사용이 가능합니다.

Calibration 이후 광원의 위치 재사용을 위하여 CMatrix으로 광원의 위치를 받고 CSV로 저장하여 사용이 가능합니다.

3 예제 코드

다음 코드와 구의 이미지를 사용하여 광원의 위치 설정이 가능합니다.

// 객체 생성
CPhotometricStereo3D photometricStereo;

// 구 ROI
CFLCircle<double> flfCalibROI;
// 구 이미지
CFLImage fliCalibImage;

// Calibration 이미지 설정
photometricStereo.SetCalibrationImage(fliCalibImage);

// 구 ROI 설정
photometricStereo.SetCalibrationCircleROI(flfCalibROI);

// Calibration 실행
photometricStereo.Calibrate();
// 객체 생성
CPhotometricStereo3D photometricStereo = new CPhotometricStereo3D();

// 구 ROI
CFLCircle<double> flfCalibROI = new CFLCircle<double>();
// 구 이미지
CFLImage fliCalibImage = new CFLImage();

// Calibration 이미지 설정
photometricStereo.SetCalibrationImage(ref fliCalibImage);

// 구 ROI 설정
photometricStereo.SetCalibrationCircleROI(flfCalibROI);

// Calibration 실행
photometricStereo.Calibrate();
# 객체 생성
photometricStereo = CPhotometricStereo3D()

# 구 ROI
flfCalibROI = CFLCircle[Double]()
# 구 이미지
fliCalibImage = CFLImage()

# Calibration 이미지 설정
photometricStereo.SetCalibrationImage(fliCalibImage)

# 구 ROI 설정
photometricStereo.SetCalibrationCircleROI(flfCalibROI)

# Calibration 실행
photometricStereo.Calibrate()

다음 코드를 사용하여 CSV를 CMatrix에 로드하여 이를 Photometric Stereo의 입력으로 사용이 가능합니다. Calibrate 함수 사용 이후 Source 이미지를 설정하고 바로 Execute가 사용 가능합니다.

// 객체 생성
CPhotometricStereo3D photometricStereo3D;

// 광원의 위치
CMatrix<double> cMatPos;
// CSV 파일 위치
CFLString<wchar_t> flStrFilePath;

// CSV 로드
cMatPos.LoadCSV(flStrFilePath);

// CSV가 광원의 위치를 X, Y, Z로 저장하면
photometricStereo3D.SetLightPositions(cMatPos);
// CSV가 광원의 위치를 Slant와 Tilt로 Degree 방식으로 저장하면
photometricStereo3D.SetLightAngleDegrees(cMatPos);
// CSV가 광원의 위치를 Slant와 Tilt로 Radian 방식으로 저장하면
photometricStereo3D.SetLightAngleRadians(cMatPos);
// 객체 생성
CPhotometricStereo3D photometricStereo3D = new CPhotometricStereo3D();

// 광원의 위치
CMatrix<double> cMatPos = new CMatrix<double>();
// CSV 파일 위치
string flStrFilePath = "";

// CSV 로드
cMatPos.LoadCSV(flStrFilePath);

// CSV가 광원의 위치를 X, Y, Z로 저장하면
photometricStereo3D.SetLightPositions(cMatPos);
// CSV가 광원의 위치를 Slant와 Tilt로 Degree 방식으로 저장하면
photometricStereo3D.SetLightAngleDegrees(cMatPos);
// CSV가 광원의 위치를 Slant와 Tilt로 Radian 방식으로 저장하면
photometricStereo3D.SetLightAngleRadians(cMatPos);
# 객체 생성
photometricStereo3D = CPhotometricStereo3D()

# 광원의 위치
cMatPos = CMatrix[Double]()
# CSV 파일 위치
flStrFilePath = ""

# CSV 로드
cMatPos.LoadCSV(flStrFilePath)

# CSV가 광원의 위치를 X, Y, Z로 저장하면
photometricStereo3D.SetLightPositions(cMatPos)
# CSV가 광원의 위치를 Slant와 Tilt로 Degree 방식으로 저장하면
photometricStereo3D.SetLightAngleDegrees(cMatPos)
# CSV가 광원의 위치를 Slant와 Tilt로 Radian 방식으로 저장하면
photometricStereo3D.SetLightAngleRadians(cMatPos)

4 추가 함수 설명

Calibration을 위한 데이터 설정 및 실행

// 객체 생성
CPhotometricStereo3D photometricStereo3D;

// Calibration 모드의 설정을 위해서는 SetLightAngleDegrees, SetLightAngleRadians, SetLightPositions으로 설정이 가능합니다.
CMatrix<double> cMatTemp;

// Degree 각도 모드로 Calibration 모드 설정
photometricStereo3D.SetLightAngleDegrees(cMatTemp);
// Radians 각도 모드로 Calibration 모드 설정
photometricStereo3D.SetLightAngleRadians(cMatTemp);
// 위치 모드로 Calibration 모드 설정
photometricStereo3D.SetLightPositions(cMatTemp);

// 설정된 Calibration 모드를 가져옵니다.
CPhotometricStereo3D::ECalibrationMode eGetCalibrationMode = photometricStereo3D.GetCalibrationMode();
// 객체 생성
CPhotometricStereo3D photometricStereo3D = new CPhotometricStereo3D();

// Calibration 모드의 설정을 위해서는 SetLightAngleDegrees, SetLightAngleRadians, SetLightPositions으로 설정이 가능합니다.
CMatrix<double> cMatTemp = new CMatrix<double>();

// Degree 각도 모드로 Calibration 모드 설정
photometricStereo3D.SetLightAngleDegrees(cMatTemp);
// Radians 각도 모드로 Calibration 모드 설정
photometricStereo3D.SetLightAngleRadians(cMatTemp);
// 위치 모드로 Calibration 모드 설정
photometricStereo3D.SetLightPositions(cMatTemp);

// 설정된 Calibration 모드를 가져옵니다.
CPhotometricStereo3D.ECalibrationMode eGetCalibrationMode = photometricStereo3D.GetCalibrationMode();
# 객체 생성
photometricStereo3D = CPhotometricStereo3D()

# Calibration 모드의 설정을 위해서는 SetLightAngleDegrees, SetLightAngleRadians, SetLightPositions으로 설정이 가능합니다.
cMatTemp = CMatrix[Double]()

# Degree 각도 모드로 Calibration 모드 설정
photometricStereo3D.SetLightAngleDegrees(cMatTemp)
# Radians 각도 모드로 Calibration 모드 설정
photometricStereo3D.SetLightAngleRadians(cMatTemp)
# 위치 모드로 Calibration 모드 설정
photometricStereo3D.SetLightPositions(cMatTemp)

# 설정된 Calibration 모드를 가져옵니다.
eGetCalibrationMode = photometricStereo3D.GetCalibrationMode()

CPhotometricStereo3D::ECalibrationMode은 CPhotometricStereo3D의 알고리즘 Calibration 방식을 저장하는데 사용됩니다.
함수 GetCalibrationMode를 사용하면 반환되는 값이 알고리즘에 설정된 Calibration 방식입니다.

// 객체 생성
CPhotometricStereo3D photometricStereo3D;

// 이미지로 Calibration 이미지 설정
CFLImage fliSetCalibImage;
photometricStereo3D.SetCalibrationImage(fliSetCalibImage);

// 이미지 포인터로 Calibration 이미지 설정
CFLImage* pFliSetCalibImage = &fliSetCalibImage;
photometricStereo3D.SetCalibrationImage(pFliSetCalibImage);

// 설정된 Calibration 이미지 불러오기
CFLImage fliGetCalibImage;
fliGetCalibImage = photometricStereo3D.GetCalibrationImage();

// 구의 위치를 표시하는 ROI를 설정합니다.
CFLCircle<double> flfSetCircleROI;
photometricStereo3D.SetCalibrationCircleROI(flfSetCircleROI);

// 구의 위치를 표시하는 포인터 ROI를 설정합니다.
CFLFigure* pFlfSetCircleROI = &flfSetCircleROI;
photometricStereo3D.SetCalibrationCircleROI(pFlfSetCircleROI);

// 설정된 구의 위치를 표시하는 ROI를 가져옵니다.
CFLCircle<double> flfGetCircleROI;
photometricStereo3D.GetCalibrationCircleROI(flfGetCircleROI);

// 설정된 구의 위치를 표시하는 포인터 ROI를 가져옵니다.
CFLFigure* pFlfGetCircleROI = &flfGetCircleROI;
photometricStereo3D.GetCalibrationCircleROI(pFlfGetCircleROI);

// 입력된 이미지와 ROI를 사용하여 Calibration을 진행합니다.
photometricStereo3D.Calibrate();
// 객체 생성
CPhotometricStereo3D photometricStereo3D = new CPhotometricStereo3D();

// 이미지로 Calibration 이미지 설정
CFLImage fliSetCalibImage = new CFLImage();
photometricStereo3D.SetCalibrationImage(ref fliSetCalibImage);

// 설정된 Calibration 이미지 불러오기
CFLImage fliGetCalibImage;
fliGetCalibImage = photometricStereo3D.GetCalibrationImage();

// 구의 위치를 표시하는 ROI를 설정합니다.
CFLCircle<double> flfSetCircleROI = new CFLCircle<double>();
photometricStereo3D.SetCalibrationCircleROI(flfSetCircleROI);

// 설정된 구의 위치를 표시하는 ROI를 가져옵니다.
CFLFigure flfGetCircleROI = new CFLCircle<double>();
photometricStereo3D.GetCalibrationCircleROI(ref flfGetCircleROI);

// 입력된 이미지와 ROI를 사용하여 Calibration을 진행합니다.
photometricStereo3D.Calibrate();
# 객체 생성
photometricStereo3D = CPhotometricStereo3D()

# 이미지로 Calibration 이미지 설정
fliSetCalibImage = CFLImage()
photometricStereo3D.SetCalibrationImage(fliSetCalibImage)

# 설정된 Calibration 이미지 불러오기
fliGetCalibImage = photometricStereo3D.GetCalibrationImage()

# 구의 위치를 표시하는 ROI를 설정합니다.
flfSetCircleROI = CFLCircle[Double]()
photometricStereo3D.SetCalibrationCircleROI(flfSetCircleROI)

# 설정된 구의 위치를 표시하는 ROI를 가져옵니다.
flfGetCircleROI = CFLCircle[Double]()
photometricStereo3D.GetCalibrationCircleROI(flfGetCircleROI)

# 입력된 이미지와 ROI를 사용하여 Calibration을 진행합니다.
photometricStereo3D.Calibrate()

함수 SetCalibrationImage는 이미지와 이미지 포인터를 입력으로 받습니다.
함수 GetCalibrationImage는 설정한 Calibration 이미지를 포인터로 가져옵니다.
함수 SetCalibrationCircleROI는 구 ROI를 설정합니다.
함수 GetCalibrationCircleROI는 설정된 구 ROI를 가져옵니다.
함수 Calibrate를 사용하면 위에 SetCalibrationImage를 사용하여 설정한 거울 구의 이미지들과 SetCalibrationCircleROI로 설정한 구의 위치를 사용하여 빛의 위치를 구하는 Calibration을 실행합니다. 두 입력 변수에 오차가 있으면 오류가 발생할 가능성이 큽니다.
SetCalibrationCircleROI에서 Circle이 아닌 다른 모양의 ROI를 입력하는 경우 오류를 반환합니다.
설정된 Calibration 이미지가 3개 미만의 Page가 있는 경우 오류를 반환합니다.
SetCalibrationImage에 사용된 이미지 들는 입력되는 모델 이미지 들과 촬영 시 광원의 위치가 같아야 합니다. 두 이미지의 Page가 섞인 경우 결과에 오류가 발생합니다.


Reconstruction Parameter 설정 및 가져오기

// 객체 생성
CPhotometricStereo3D photometricStereo3D;

// 광원의 위치를 Radian으로 입력
CMultiVar<double> cMulVarDSetAngleRadianSlant;
CMultiVar<double> cMulVarDSetAngleRadianTilt;

photometricStereo3D.SetLightAngleRadians(cMulVarDSetAngleRadianSlant, cMulVarDSetAngleRadianTilt);

// 설정된 광원의 위치를 Radian으로 받아옵니다.
CMultiVar<double> cMulVarDGetAngleRadianSlant;
CMultiVar<double> cMulVarDGetAngleRadianTilt;

photometricStereo3D.GetLightAngleRadians(cMulVarDGetAngleRadianSlant, cMulVarDGetAngleRadianTilt);

// 광원의 위치를 Degree로 입력
CMultiVar<double> cMulVarDSetAngleDegreeSlant;
CMultiVar<double> cMulVarDSetAngleDegreeTilt;

photometricStereo3D.SetLightAngleDegrees(cMulVarDSetAngleDegreeSlant, cMulVarDSetAngleDegreeTilt);

// 설정된 광원의 위치를 Degree로 받아옵니다.
CMultiVar<double> cMulVarDGetAngleDegreeSlant;
CMultiVar<double> cMulVarDGetAngleDegreeTilt;

photometricStereo3D.GetLightAngleDegrees(cMulVarDGetAngleDegreeSlant, cMulVarDGetAngleDegreeTilt);

// 광원의 위치를 Position으로 입력
CMultiVar<double> cMulVarSetPositionX;
CMultiVar<double> cMulVarSetPositionY;
CMultiVar<double> cMulVarSetPositionZ;

photometricStereo3D.SetLightPositions(cMulVarSetPositionX, cMulVarSetPositionY, cMulVarSetPositionZ);

// 설정된 광원의 위치를 Position으로 받아옵니다.
CMultiVar<double> cMulVarGetPositionX;
CMultiVar<double> cMulVarGetPositionY;
CMultiVar<double> cMulVarGetPositionZ;

photometricStereo3D.GetLightPositions(cMulVarGetPositionX, cMulVarGetPositionY, cMulVarGetPositionZ);
// 객체 생성
CPhotometricStereo3D photometricStereo3D = new CPhotometricStereo3D();

// 광원의 위치를 Radian으로 입력
CMultiVar<double> cMulVarDSetAngleRadianSlant = new CMultiVar<double>();
CMultiVar<double> cMulVarDSetAngleRadianTilt = new CMultiVar<double>();

photometricStereo3D.SetLightAngleRadians(cMulVarDSetAngleRadianSlant, cMulVarDSetAngleRadianTilt);

// 설정된 광원의 위치를 Radian으로 받아옵니다.
CMultiVar<double> cMulVarDGetAngleRadianSlant = new CMultiVar<double>();
CMultiVar<double> cMulVarDGetAngleRadianTilt = new CMultiVar<double>();

photometricStereo3D.GetLightAngleRadians(ref cMulVarDGetAngleRadianSlant, ref cMulVarDGetAngleRadianTilt);

// 광원의 위치를 Degree로 입력
CMultiVar<double> cMulVarDSetAngleDegreeSlant = new CMultiVar<double>();
CMultiVar<double> cMulVarDSetAngleDegreeTilt = new CMultiVar<double>();

photometricStereo3D.SetLightAngleDegrees(cMulVarDSetAngleDegreeSlant, cMulVarDSetAngleDegreeTilt);

// 설정된 광원의 위치를 Degree로 받아옵니다.
CMultiVar<double> cMulVarDGetAngleDegreeSlant = new CMultiVar<double>();
CMultiVar<double> cMulVarDGetAngleDegreeTilt = new CMultiVar<double>();

photometricStereo3D.GetLightAngleDegrees(ref cMulVarDGetAngleDegreeSlant, ref cMulVarDGetAngleDegreeTilt);

// 광원의 위치를 Position으로 입력
CMultiVar<double> cMulVarSetPositionX = new CMultiVar<double>();
CMultiVar<double> cMulVarSetPositionY = new CMultiVar<double>();
CMultiVar<double> cMulVarSetPositionZ = new CMultiVar<double>();

photometricStereo3D.SetLightPositions(cMulVarSetPositionX, cMulVarSetPositionY, cMulVarSetPositionZ);

// 설정된 광원의 위치를 Position으로 받아옵니다.
CMultiVar<double> cMulVarGetPositionX = new CMultiVar<double>();
CMultiVar<double> cMulVarGetPositionY = new CMultiVar<double>();
CMultiVar<double> cMulVarGetPositionZ = new CMultiVar<double>();

photometricStereo3D.GetLightPositions(ref cMulVarGetPositionX, ref cMulVarGetPositionY, ref	cMulVarGetPositionZ);
# 객체 생성
photometricStereo3D = CPhotometricStereo3D()

# 광원의 위치를 Radian으로 입력
cMulVarDSetAngleRadianSlant = CMultiVar[Double]()
cMulVarDSetAngleRadianTilt = CMultiVar[Double]()

photometricStereo3D.SetLightAngleRadians(cMulVarDSetAngleRadianSlant, cMulVarDSetAngleRadianTilt)

# 설정된 광원의 위치를 Radian으로 받아옵니다.
cMulVarDGetAngleRadianSlant = CMultiVar[Double]()
cMulVarDGetAngleRadianTilt = CMultiVar[Double]()

photometricStereo3D.GetLightAngleRadians(cMulVarDGetAngleRadianSlant, cMulVarDGetAngleRadianTilt)

# 광원의 위치를 Degree로 입력
cMulVarDSetAngleDegreeSlant = CMultiVar[Double]()
cMulVarDSetAngleDegreeTilt = CMultiVar[Double]()

photometricStereo3D.SetLightAngleDegrees(cMulVarDSetAngleDegreeSlant, cMulVarDSetAngleDegreeTilt)

# 설정된 광원의 위치를 Degree로 받아옵니다.
cMulVarDGetAngleDegreeSlant = CMultiVar[Double]()
cMulVarDGetAngleDegreeTilt = CMultiVar[Double]()

photometricStereo3D.GetLightAngleDegrees(cMulVarDGetAngleDegreeSlant, cMulVarDGetAngleDegreeTilt)

# 광원의 위치를 Position으로 입력
cMulVarSetPositionX = CMultiVar[Double]()
cMulVarSetPositionY = CMultiVar[Double]()
cMulVarSetPositionZ = CMultiVar[Double]()

photometricStereo3D.SetLightPositions(cMulVarSetPositionX, cMulVarSetPositionY, cMulVarSetPositionZ)

# 설정된 광원의 위치를 Position으로 받아옵니다.
cMulVarGetPositionX = CMultiVar[Double]()
cMulVarGetPositionY = CMultiVar[Double]()
cMulVarGetPositionZ = CMultiVar[Double]()

photometricStereo3D.GetLightPositions(cMulVarGetPositionX, cMulVarGetPositionY, cMulVarGetPositionZ)

함수 SetLightAngleRadians는 광원의 위치를 Radian Slant와 Tilt로 설정합니다.
함수 GetLightAngleRadians는 설정된 광원의 위치를 Radian Slant와 Tilt로 받아옵니다.
함수 SetLightAngleDegrees는 광원의 위치를 Degree Slant와 Tilt로 설정합니다.
함수 GetLightAngleDegrees는 설정된 광원의 위치를 Degree Slant와 Tilt로 받아옵니다.
함수 SetLightPositions는 광원의 위치를 Position으로 설정합니다.
함수 GetLightPositions는 설정된 광원의 위치를 Position으로 가져옵니다.

위 Set 함수를 사용하면 설정한 데이터의 방식으로 Calibrate 방식이 설정됩니다. SetLightAngleRadians으로 설정을 진행한 경우 Calibration이 ECalibrationMode_Angle_Radians으로 설정됩니다.
위 Get 함수를 설정되지 않은 Calibrate 방식으로 불러오면 오류를 반환합니다. Calibration 방식이 ECalibrationMode_Angle_Radians으로 설정된 경우 GetLightAngleRadians으로 광원의 위치를 받을 수 있고 GetLightAngleDegrees으로는 오류를 반환합니다.

// 객체 생성
CPhotometricStereo3D photometricStereo3D;

// 광원의 위치를 Radian으로 입력
CMatrix<double> cMatSetAngleRadian;

photometricStereo3D.SetLightAngleRadians(cMatSetAngleRadian);

// 설정된 광원의 위치를 Radian으로 받아옵니다.
CMatrix<double> cMatGetAngleRadian;

photometricStereo3D.GetLightAngleRadians(cMatGetAngleRadian);

// 광원의 위치를 Degree로 입력
CMatrix<double> cMatSetAngleDegree;

photometricStereo3D.SetLightAngleDegrees(cMatSetAngleDegree);

// 설정된 광원의 위치를 Degree로 받아옵니다.
CMatrix<double> cMatGetAngleDegree;

photometricStereo3D.GetLightAngleDegrees(cMatGetAngleDegree);

// 광원의 위치를 Position으로 입력
CMatrix<double> cMatSetPosition;

photometricStereo3D.SetLightPositions(cMatSetPosition);

// 설정된 광원의 위치를 Position으로 받아옵니다.
CMatrix<double> cMatGetPosition;

photometricStereo3D.GetLightPositions(cMatGetPosition);
// 객체 생성
CPhotometricStereo3D photometricStereo3D = new CPhotometricStereo3D();

// 광원의 위치를 Radian으로 입력
CMatrix<double> cMatSetAngleRadian = new CMatrix<double>();

photometricStereo3D.SetLightAngleRadians(cMatSetAngleRadian);

// 설정된 광원의 위치를 Radian으로 받아옵니다.
CMatrix<double> cMatGetAngleRadian = new CMatrix<double>();

photometricStereo3D.GetLightAngleRadians(ref cMatGetAngleRadian);

// 광원의 위치를 Degree로 입력
CMatrix<double> cMatSetAngleDegree = new CMatrix<double>();

photometricStereo3D.SetLightAngleDegrees(cMatSetAngleDegree);

// 설정된 광원의 위치를 Degree로 받아옵니다.
CMatrix<double> cMatGetAngleDegree = new CMatrix<double>();

photometricStereo3D.GetLightAngleDegrees(ref cMatGetAngleDegree);

// 광원의 위치를 Position으로 입력
CMatrix<double> cMatSetPosition = new CMatrix<double>();

photometricStereo3D.SetLightPositions(cMatSetPosition);

// 설정된 광원의 위치를 Position으로 받아옵니다.
CMatrix<double> cMatGetPosition = new CMatrix<double>();

photometricStereo3D.GetLightPositions(ref cMatGetPosition);
# 객체 생성
photometricStereo3D = CPhotometricStereo3D()

# 광원의 위치를 Radian으로 입력
cMatSetAngleRadian = CMatrix[Double]()

photometricStereo3D.SetLightAngleRadians(cMatSetAngleRadian)

# 설정된 광원의 위치를 Radian으로 받아옵니다.
cMatGetAngleRadian = CMatrix[Double]()

photometricStereo3D.GetLightAngleRadians(cMatGetAngleRadian)

# 광원의 위치를 Degree로 입력
cMatSetAngleDegree = CMatrix[Double]()

photometricStereo3D.SetLightAngleDegrees(cMatSetAngleDegree)

# 설정된 광원의 위치를 Degree로 받아옵니다.
cMatGetAngleDegree = CMatrix[Double]()

photometricStereo3D.GetLightAngleDegrees(cMatGetAngleDegree)

# 광원의 위치를 Position으로 입력
cMatSetPosition = CMatrix[Double]()

photometricStereo3D.SetLightPositions(cMatSetPosition)

# 설정된 광원의 위치를 Position으로 받아옵니다.
cMatGetPosition = CMatrix[Double]()

photometricStereo3D.GetLightPositions(cMatGetPosition)

함수들은 위 결과와 같은 출력/입력을 받습니다.
Matrix의 경우 함수를 사용하여 CSV로 저장 및 불러오기가 가능합니다.

// 객체 생성
CPhotometricStereo3D photometricStereo3D;

// Photometric Stereo Reconstruction 모드 설정
CPhotometricStereo3D::EReconstructionMode eReconstructionMode = CPhotometricStereo3D::EReconstructionMode_Poisson_FP32;

// 3D 모델 재구성 방식을 RFT Floating 32로 설정합니다.
eReconstructionMode = CPhotometricStereo3D::EReconstructionMode_RFT_FP32;
// 3D 모델 재구성 방식을 RFT Floating 64로 설정합니다.
eReconstructionMode = CPhotometricStereo3D::EReconstructionMode_RFT_FP64;
// 3D 모델 재구성 방식을 FFT Floating 32로 설정합니다.
eReconstructionMode = CPhotometricStereo3D::EReconstructionMode_FFT_FP32;
// 3D 모델 재구성 방식을 FFT Floating 64로 설정합니다.
eReconstructionMode = CPhotometricStereo3D::EReconstructionMode_FFT_FP64;
// 3D 모델 재구성 방식을 Poisson Floating 32로 설정합니다.
eReconstructionMode = CPhotometricStereo3D::EReconstructionMode_Poisson_FP32;
// 3D 모델 재구성 방식을 Poisson Floating 64로 설정합니다.
eReconstructionMode = CPhotometricStereo3D::EReconstructionMode_Poisson_FP64;

// Reconstruction 모드를 설정합니다.
CPhotometricStereo3D::EReconstructionMode eSetReconstructionMode = eReconstructionMode;
photometricStereo3D.SetReconstructionMode(eSetReconstructionMode);

// 설정된 Reconstruction 모드를 가져옵니다.
CPhotometricStereo3D::EReconstructionMode eGetReconstructionMode = photometricStereo3D.GetReconstructionMode();
// 객체 생성
CPhotometricStereo3D photometricStereo3D = new CPhotometricStereo3D();

// Photometric Stereo Reconstruction 모드 설정
CPhotometricStereo3D.EReconstructionMode eReconstructionMode = CPhotometricStereo3D.EReconstructionMode.Poisson_FP32;

// 3D 모델 재구성 방식을 RFT Floating 32로 설정합니다.
eReconstructionMode = CPhotometricStereo3D.EReconstructionMode.RFT_FP32;
// 3D 모델 재구성 방식을 RFT Floating 64로 설정합니다.
eReconstructionMode = CPhotometricStereo3D.EReconstructionMode.RFT_FP64;
// 3D 모델 재구성 방식을 FFT Floating 32로 설정합니다.
eReconstructionMode = CPhotometricStereo3D.EReconstructionMode.FFT_FP32;
// 3D 모델 재구성 방식을 FFT Floating 64로 설정합니다.
eReconstructionMode = CPhotometricStereo3D.EReconstructionMode.FFT_FP64;
// 3D 모델 재구성 방식을 Poisson Floating 32로 설정합니다.
eReconstructionMode = CPhotometricStereo3D.EReconstructionMode.Poisson_FP32;
// 3D 모델 재구성 방식을 Poisson Floating 64로 설정합니다.
eReconstructionMode = CPhotometricStereo3D.EReconstructionMode.Poisson_FP64;

// Reconstruction 모드를 설정합니다.
CPhotometricStereo3D.EReconstructionMode eSetReconstructionMode = eReconstructionMode;
photometricStereo3D.SetReconstructionMode(eSetReconstructionMode);

// 설정된 Reconstruction 모드를 가져옵니다.
CPhotometricStereo3D.EReconstructionMode eGetReconstructionMode = photometricStereo3D.GetReconstructionMode();
# 객체 생성
photometricStereo3D = CPhotometricStereo3D()

# Photometric Stereo Reconstruction 모드 설정
eReconstructionMode = CPhotometricStereo3D.EReconstructionMode.Poisson_FP32

# 3D 모델 재구성 방식을 RFT Floating 32로 설정합니다.
eReconstructionMode = CPhotometricStereo3D.EReconstructionMode.RFT_FP32
# 3D 모델 재구성 방식을 RFT Floating 64로 설정합니다.
eReconstructionMode = CPhotometricStereo3D.EReconstructionMode.RFT_FP64
# 3D 모델 재구성 방식을 FFT Floating 32로 설정합니다.
eReconstructionMode = CPhotometricStereo3D.EReconstructionMode.FFT_FP32
# 3D 모델 재구성 방식을 FFT Floating 64로 설정합니다.
eReconstructionMode = CPhotometricStereo3D.EReconstructionMode.FFT_FP64
# 3D 모델 재구성 방식을 Poisson Floating 32로 설정합니다.
eReconstructionMode = CPhotometricStereo3D.EReconstructionMode.Poisson_FP32
# 3D 모델 재구성 방식을 Poisson Floating 64로 설정합니다.
eReconstructionMode = CPhotometricStereo3D.EReconstructionMode.Poisson_FP64

# Reconstruction 모드를 설정합니다.
eSetReconstructionMode = eReconstructionMode
photometricStereo3D.SetReconstructionMode(eSetReconstructionMode)

# 설정된 Reconstruction 모드를 가져옵니다.
eGetReconstructionMode = photometricStereo3D.GetReconstructionMode()

CPhotometricStereo3D::EReconstructionMode은 CPhotometricStereo3D의 알고리즘 Reconstruction 방식을 저장하는 데 사용됩니다.
함수 SetReconstructionMode를 사용하면 Reconstruction 방식의 설정이 가능합니다.
함수 GetReconstructionMode를 사용하면 반환되는 값이 알고리즘에 설정된 Reconstruction 방식입니다.