- 주제 : 카메라 2개와 레이저 포인터를 사용한 광학식 3차원 스캐너
- 개발 범위 : 카메라로 데이터 획득 --> Reconstruction (3D point cloud)
- 구성품 : 카메라와 렌즈 2 set, 레이저 포인터, 카메라를 고정할 지지대
- Calibration (cv::stereoCalibrate )
두 개의 카메라에서 활영한 영상에서 각각의 대응점을 찾고, 두 카메라 사이의 정보가 있으면 객체의 실제 3차원 좌표를 계산 할 수 있다.
일단 카메라 사이의 정보가 필요하다. OpenCV의 Streo Calibration을 수행하여 두 카메라 간의 기하학적 정보 R, T를 계산한다.
- 대응점(corresponding points) 검출
왼쪽 카메라에서 보이는 한 점이 오른쪽 카메라에서 어떤 점일까?
사람은 매우 똑똑하기 때문에 쉽게 대응점을 찾지만 컴퓨터가 카메라 영상에서 일치하는 점을 찾기는 어렵다.
그래서 3차원 스캐너에서는 보통 여러종류의 패턴을 사용한다.
일단 주위에서 쉽게 구할 수 있는 레이저 포인터를 사용해보자.
레이저 포인터를 사용하여 손쉽게 대응점을 찾을 수 있었다.
각 카메라의 영상에서 레이저 포인터의 중심점(x, y)를 얻는다.
여러가지 방법이 있을 수 있겠지만.. 나는 cv::Canny --> cv::findContours --> cv::fitEllipse 를 사용하여 중점을 계산하였다.
- 대응점에 대한 Ray 계산
초점거리(f)와 주점(cx, cy) 그리고 전 단계에서 알아낸 대응점 좌표를 사용하여 카메라의 중심에서부터의 Ray를 계산한다.
초점거리와 주점은 카메라 calibration을 수행하면 얻을 수 있다. (cv::calibrateCamera 또는 cv::stereoCalibrate)
calibration을 하지 않는다면 렌즈의 초점거리를 초점거리(f)로, 이미지 센서의 중점을 주점(cx, cy)로 사용 할 수 있다.
정밀도는 매우 떨어진다.
정밀도는 매우 떨어진다.
- 두 Ray의 교점 계산 (triangulation)
우리는 한 변과 양 끝의 각을 알면 유일한 삼각형을 만들 수 있다는것을 알고있다.
두 카메라의 기하학적인 관계(R|t)를 알고 있으며 양 끝에서의 Ray(크기와 방향을 가지는 vector)를 알고 있으므로 유일한 삼각형을 만들어 낼 수 있다.
두 벡터의 교점을 구하면 레이저 포인터가 가리키는 한 점에 대한 3차원 좌표를 계산 할 수 있다.
- 결과
레이저 포인터가 가리키는 한 점에 대한 3차원 데이터를 매우 빠르게 얻을 수 있다.
하지만 넓은 영역을 측정하기 힘들다.
댓글 없음:
댓글 쓰기