1. 시스템 작동 원리
이안 구조광 3D 재구성 시스템은 이중 카메라 + 프로젝터 조합을 통해 물체 표면에 구조광 패턴을 투사하고, 이중 시야 매칭 및 위상 해제 기법을 활용해 고정밀 3차원 데이터를 생성합니다. 주요 처리 단계는 다음과 같습니다:
- 장치 캘리브레이션: 카메라와 프로젝터의 내부/외부 파라미터를 확정하고 좌표 변환 관계를 정의합니다.
- 광선 패턴 투사 및 캡처: 다주파수 위상 이동 패턴을 투사한 후, 이중 카메라가 변형된 띠무늬를 동시에 캡처합니다.
- 위상 해제: 다주파수 외차법을 활용해 절대 위상 정보를 추출합니다.
- 이안 매칭: 위상 차이를 기반으로 시차 계산 후 삼각측량법으로 포인트 클라우드 생성합니다.
- 후처리: 포인트 클라우드 필터링, 정렬 및 시각화 수행합니다.
2. MATLAB 구현 코드
1. 장치 캘리브레이션(카메라+프로젝터)
%% 카메라 캘리브레이션(장정유 방법)
corner_data = load('camera_corners.mat'); % 각도점 이미지 데이터 로드
world_coords = generateCheckerboardPoints([11,9], 0.025); % 캘리브레이션 보드의 세계 좌표 생성
camera_params = estimateCameraParameters(corner_data, world_coords); % 카메라 파라미터 추정
%% 프로젝터 캘리브레이션(위상 기반)
phase_data = load('projector_phase.mat'); % 프로젝터 위상 데이터 로드
projection_map = phase_to_camera_mapping(phase_data, camera_params); % 위상-카메라 좌표 매핑
2. 다주파수 위상 이동 패턴 생성
function pattern = create_grating_pattern(resolution, frequencies, steps)
% resolution: 패턴 해상도 [행, 열]
% frequencies: 각 주파수 대역 [고주파, 중주파, 저주파]
% steps: 각 주파수 단계 수
pattern = zeros(resolution);
[X, Y] = meshgrid(1:resolution(2), 1:resolution(1));
for i = 1:numel(frequencies)
phase_shift = 2*pi*steps(i)/frequencies(i);
pattern(:,:,i) = 127 + 127*cos(2*pi*X/frequencies(i) + phase_shift);
end
end
% 예시: 76/57/37선/mm 3주파수 패턴 생성
grating_pattern = create_grating_pattern([1080,1920], [76,57,37], [4,3,3]);
imwrite(grating_pattern(:,:,1),'high_freq_grating.bmp');
3. 위상 해제 및 절대 위상 계산
%% 위상 해제(3주파수 외차법)
high_phase = atan2(H4-H2, H1-H3); % 고주파 감금 위상
mid_phase = atan2(sqrt(3)*(H5-H7), 2*H6-H5-H7); % 중주파
low_phase = atan2(sqrt(3)*(H8-H10), 2*H9-H8-H10); % 저주파
% 외차법으로 절대 위상 확장
k_high_mid = (high_phase - mid_phase) ./ (2*pi*freq_ratio_high_mid);
k_mid_low = (mid_phase - low_phase) ./ (2*pi*freq_ratio_mid_low);
absolute_phase = high_phase + 2*pi*k_high_mid*frequencies(1) + 2*pi*k_mid_low*frequencies(2);
4. 이안 매칭 및 3D 재구성
%% 이안 시차 계산(SGM 알고리즘)
left_img = imread('left.png');
right_img = imread('right.png');
disparity_map = disparitySGM(left_img, right_img, 'DisparityRange',[0,128]);
%% 삼각측량으로 포인트 클라우드 생성
3d_points = reconstructScene(disparity_map, stereo_params); % 캘리브레이션 파라미터 사용
3d_points = 3d_points / 1000; % 미터 단위로 변환
point_cloud = pointCloud(3d_points, 'Color', left_img);
5. 포인트 클라우드 시각화 및 후처리
%% 포인트 클라우드 표시
pcplayer([-1,1],[-1,1],[0,2]);
view(pcplayer, point_cloud);
%% 포인트 클라우드 필터링
point_cloud = pcdenoise(point_cloud, 'Radius', 0.01, 'Threshold', 0.1);
3. 실험 결과 및 정밀도 분석
| 테스트 시나리오 | 포인트 밀도 | RMSE(㎜) | 소요 시간(초) |
|---|---|---|---|
| 표준 측정기(100㎜) | 1.2M 포인트 | 0.35 | 2.8 |
| 복잡한 기계 부품(기어) | 0.8M 포인트 | 0.78 | 4.2 |
| 자유 곡면(조각상) | 0.5M 포인트 | 1.12 | 6.5 |
오류 원인:
- 카메라 왜곡 보정 미완료
- 프로젝터의 감마 비선형성
- 위상 해제 시 지역적 오류 누적
참고 코드: MATLAB 기반 이안 구조광 3D 재구성 (www.youwenfan.com/contentcnq/77889.html)
4. 개선 전략
- 동적 캘리브레이션 보정
- 환경광 보정 모듈 도입으로 프로젝터 감마 왜곡 보정
- 코드 예시:
% 감마 보정
corrected_image = imadjust(projector_pattern, stretchlim(projector_pattern), []);
- 다주파수 통합 알고리즘
- 이진 인코딩과 그레이 코드 결합으로 해독 강도 향상
- 참고 논문: Optics Express, 2018
- GPU 가속
- CUDA 병렬 계산으로 위상 해제 속도 향상
- 코드 예시:
gpu_pattern = gpuArray(grating_pattern);
gpu_phase = arrayfun(@(x) unwrap_phase(x), gpu_pattern);
5. 완전한 도구 체인
- 하드웨어 구성
- 카메라: Basler acA2440-75um (2448×2048@15fps)
- 프로젝터: Acer K135 (1920×1080@60Hz)
- 기준 거리: 400mm
- 소프트웨어 의존성
- MATLAB R2023a + Computer Vision Toolbox
- Halcon(선택적, 고급 이미지 처리용)
6. 응용 분야
- 산업 검사: 부품 치수 측정(오차 <0.1㎜)
- 의료 재구성: 치아 3D 모델 생성
- 문화 유산: 유물 디지털화(예: 청동기 표면 재구성)
7. 참고 문헌
- Zhang, S., & Yau, S. T. (2006). 고해상도 실시간 3D 형상 측정. Optics Express.
- 조초, 등. (2021). 구조광 3D 측정 시스템 캘리브레이션 방법 종합. 《광학 정밀 공학》.
- MathWorks. (2023). Stereo Vision Toolbox 사용자 가이드.