티스토리 뷰
스테레오 비전 소개
두 장의 영상으로 3차원 영상정보를 얻을 수 있음
하나의 영상만으로는 실제 월드좌표 X가 image plan의 점 x를 지나는 선 위에 존재한다는 것만 알 수 있다.
별도 추가 카메라를 이용한다면 두 직선의 접점을 구할 수 있기때문에 X를 특정할 수 있다.
= Triangulation
월드좌표 X에 대응되는 x(카메라C)와 x'(카메라C') 정의
사전에 두 카메라에 대한 카메라 매트릭스 P 구해야함.
C와 x를 잇는 직선(ray)과 C' 와 x'를 잇는 직선의 교차점을 구하면 되는데 실제로는 노이즈가 있음.
기존 식인 x = PX에 scale을 추가해 x = aPX 처럼 표현하고 같은 방향 벡터 외적은 0이므로?
X에 대한 계산식을 유도할 수 있다?
$ \begin{bmatrix}x \\y \\ 1\end{bmatrix}
\times \begin{bmatrix}P_{1}^{T}X \\P_{2}^{T}X \\ P_{3}^{T}X\end{bmatrix} =
\begin{bmatrix}yP_{3}^{T}X-P_{2}^{T}X \\P_{1}^{T}X-xP_{3}^{T}X \\ xP_{2}^{T}X-yP_{1}^{T}X\end{bmatrix} = \begin{bmatrix}0 \\0 \\ 0\end{bmatrix}$
이를 AX=0 형태로 유도할 수 있다.
마찬가지로 다른 하나의 카메라에 대해서도 식을 유도할 수 있고 결국 총 4개의 식을 만들어 낼 수 있는 것이다.
LSM이나 SVD를 통해 0이 아닌 최적의 X를 찾아낸다.
스테레오 비전에서의 depth
이런 방법으로 뎁스를 측정하지는 않는다.
두 카메라에서 찍은 이미지의 plane이 나란히 있다고 가정해보자.
이렇게 하면 간단한 삼각 비례식을 이용할 수 있다.
먼저 알고있는 정보는 카메라의 초점거리 f, 카메라 사이 거리 b, x와x'사이의 거리 b-d , 이를 이용해 depth z를 알아내야한다.
z-f:z = b-d:b (왜 x와 x'사이가 b-d지? )
뎁스 z = fb/d 라는 결과가 나온다.
하지만 실제 카메라에서는 이러한 가정이 성립하지 않는다.
만족하도록 image rectification 과정을 거쳐야한다.
epipolar geometry
나란하지 않은 두 이미지 평면에서 카메라 사이를 잇는 직선을 생각해보자.
직선과 평면이 만나는 점을 epipole이라한다.
그리고 새로운 평면 epipolar plane 을 추가로 정의하는데 이는 카메라와 epipole, 관측한 X를 모두 포함하는 평면이다.
또한 각 image 평면에서 epipole 점과 image plane 에서의 점 x를 이은 선을 epipolar line이라 한다.
image plane과 epipolar line이 만나는 선이라고 볼 수도 있다.
이 둘 사이의 상대 좌표를 구할 수 있는 방법이 Essential matrix, fundamental matrix 이며
계산을 위해서는 Eight-point 알고리즘을 사용할 수 있다.
결론
image rectification을 수행해놓으면 다른 이미지에 대응되는 점은 이미지에서 찾는 게 아니라
epipolar line을 따라 찾으면 된다.
스테레오 비전의 계산 방법
스테레오 비전에서는 대응되는 점과 epipolar line과 관계를 평행하게 만들어
임의로 나란한 image plane을 만든다고 볼 수 있다.
결국 초점 거리도 똑같은 rectified 된 이미지를 만들 수 있다.
Stereo Rectification의 단계
- R 을 이용해 우측(혹은 좌측) 카메라 회전
- 두 카메라의 이미지 평면간 회전 변환 매트릭스(Essential matrix로 추출) 사용
- 이미지 평면간 평행
- epipolar line의 평행성 보장 X
- 좌측 카메라 rectification - 좌측카메라를 회전함으로써 epipole is at infinity
- Essential matrix 에서 추출한 t matrix 활용
- $R_{rect}$ 이용해 epiporal line이 평행하도록 구현
- 우측 카메라 rectification - 좌측카메라를 ...
Stereo image rectification 최종 정리
- 카메라 내부 파라미터 $K, K'$ 추정
- 8-point 알고리즘으로 Fundamental matrix $\mathbf{F}$ 추정, F에서 Essential matrix $\mathbf{E}$ 추출
- Essential matrix로부터 $\mathbf{R}$과 $\mathbf{T}$ 분해
- T로부터 $R_{rect}$ 추정, $R_{1}=R_{rect} R_{2}=RR_{rect}$로 가정
- 좌측 카메라 회전 $R_{1}$ 이용
- Rectified left image points p
- $R_{2}$ 이용 우측 카메라에 대해서도 5,6번 반복
rectification의 장점: 이미지 포인트 대응점을 일일이 찾기위해 비효율적 알고리즘을 사용하지 않아도 됨
그럼 두 포인트를 매칭시키려면 어떻게 해야할까?
Zero-mean, Sum of Squared Differences(SSD), Normalized Cross-correlation, Semi-Global Matching 과 같은 전통적인 방법이 있다.
Block matching
rectified 된 이미지로 매칭을 하기때문에 같은 높이의 픽셀에서 대응점을 찾으면 된다.
동일 epipolar 선상에서 shift 시켜가며 유사한 픽셀을 찾는다.
이때 한 블럭의 차이 값(cost)을 계산하며 cost가 가장 작은 블럭을 찾는다.
Sum of Squared Differences로 계산하면 블럭의 차의 제곱을 합을 계산한다.
다른 방법도 수식은 다르지만 노이즈를 줄이기위한 다양한 과정이다.
(다만 픽셀의 차이를 계산하고자 하는 것은 동일하다.)
SGM 방식은 해당 블럭 영역에 대한 cost만 계산하는 것이 아닌 수평, 수직, 대각성분에 대한 차이를 계산한다.
이 차이를 비교하면서 cost가 가장 작은 위치를 찾아낸다. 꽤 넓은 이미지에서 대응점을 찾기 위함이기에 더 정교한 결과를 만들어낼 수 있다.
블럭의 사이즈
이미지는 항상 노이즈가 있다. 또한 두 픽셀간 rectification 이미지에 대한 에러도 있기에 100% 일치하는 이미지는 없다.
때문에 블럭 사이즈가 작다면 정교한 depth 값을 알아낼 수 있지만 노이즈에 의해 depth가 고르지 않을 수 있다.
반대로 사이즈를 키운다면 디테일이 줄고 노이즈에 강인해지는 효과를 볼 수 있다.
다만 얇은 물체에 대한 거리(depth)와 유사한 픽셀에 대한 거리를 구하지 못할 수 있다.
때문에 사전에 촬영하는 장면, 카메라 베이스라인, 환경을 고려하여 알맞는 사이즈를 결정해야한다.
stereo vision의 한계 occlusion
카메라 시점차에 의한 parallax에 자유로울 수 없다.
시점에 따라 한 카메라에서 보이는 영역이 다른 카메라에서 보이지 않을 수 있다.
때문에 해당 영역에 대해 cost를 계산할 수 없다.
때문에 스테레오 매칭은 만능이 아니며
스테레오 매칭을 통해 촬영할 수 있는 좋은 환경이 따로 존재한다는 것이다.
스테레오 비전의 활용
적용
스테레오 비전은 이미지 정보를 3차원으로 구축하는 데 중요한 방법이다.
먼저 내부 파라미터를 알고있는 카메라 두 대와 그 사이 베이스라인을 알고 있어야한다.
또한 동시에 촬영해야하기에 시간적으로 동기화되어있어야 하기에 물리적으로 동기화되어 있어야 한다.
image rectificaiton 을 매 프레임마다 계산하는 것이 아닌 샘플 이미지로 transformation matrix를 구하고 항상 이 matrix로 rectificatin image를 만들어 내는 것이다.
그리고 픽셀마다 cost를 계산하는 것이 아닌 3차원의 cost volume을 구성하고 벡터 연산으로 빠르게 추정한다.
하지만 이전에 얘기했던 스테레오 비전의 한계는 여전히 명확하다.
시점차에 의해 cost를 계산할 수 없는 경우나, 하얀 벽과 같이 비슷한 픽셀이 많은 경우 depth를 구할 수 없다.
(때문에 SGM과 같은 알고리즘이 글로벌 정보로 매칭을 하기에 더 정교한 대응점을 찾을 수 있는 것이다.)
딥러닝
피라미드 스테레오 매칭 PSMNet
두 가지 모듈로 구분할 수 있는데 그 중 하나가 SPP(spatial pyramid polling), 다른 하나는 3D CNN7
스테레오 매칭에서 중요한 것은 다양한 매칭을 찾아내는 것이다.
딥러닝 알고리즘의 SPP모듈에서는 다양한 크기의 feature맵을 추출한다.
다양한 정보를 한꺼번에 들고와서 학습하기 위한 방법인데, 이전의 방법과 마찬가지로 local + global 정보를 추출하여 의미가 있는 정보를 가져오는 과정이라고 생각할 수 있다.
이렇게 SPP모듈로 얻어진 좌우 이미지 정보를 4D 형상의 cost volume으로 구성한다.
하나의 볼륨을 voxel이라고 하는데 하나의 값이 아닌 두 영상에서 만들어진 값이기에 4D라고 한다.
이런 feature를 딥러닝 네트워크의 stacked hourglass 구조로 학습시키는데 코스트가 가장 낮게 나오는 disparity 레벨을 추정하도록 학습된다. 코스트를 확률적으로 표현하고 정규화를 진행하고, disparity와 합하여 softmax와 indices를 통해 표현한다. 우리가 찾은 값이 뾰족하게 만들어지도록 학습되는데 이것이 PSMNet이다.
(PSMNet이 딥러닝으로 스테레오 매칭을 잘 구현한 대표적인 방법인데 (2018년)논문을 읽어봐야 이해할 수 있을 것 같다.)
적용 사례
화성 탐사 로봇 같은 경우 시간적으로 지연이 발생한다. 때문에 다음 통신까지 어떻게 수행해야 한다는 명령 프로세스를 한번에 입력시키는데... 직전에 측정한 노면 정보로 통신없이 자율 주행을 해야한다. 또한 카메라 이외 정밀 센서는 화성의 환경을 견딜 수 없다.
노면 값에 따라 차량 서스펜션을 변화시키는 장치(벤츠 매직 바디 컨트롤)
스테레오 카메라로 15미터 전방의 노면 정보를 추정하고 충격이 있을만한 노면을 지날 때 충격을 완화시키기 위해 능동적으로 차량 서스펜션을 컨트롤한다.
IR 패턴 활용 depth 추정(인텔 리얼센스 카메라)
이전에 말했듯 스테레오 비전의 단점으로 텍스처가 없거나 반복된 텍스처일 경우 occlusion에 취약하다. 때문에 카메라 내부에서 자체적으로 적외선 패턴을 쏘아 적외선 카메라로 스테레오 매칭을 수행한다.
다만 IR 이기에 태양광에 취약해 실내에서 사용할 수 있다.
스테레오 라이다 퓨전
라이다는 상대적으로 정확한 depth 측정이 가능하지만 밀도가 부족하다는 단점이 있다.
이 연구에서는 스테레오 매칭의 밀도 높은 정보와 라이다의 정확도를 융합했다.
라이다로 얻어진 정보로 코스트 볼륨에 해당하는 disparity 위치를 업데이트 한다. 그리고 최적화를 거쳐 더욱 정교한 매칭 알고리즘이 되겠다. https://github.com/zswang666/Stereo-LiDAR-CCVNorm
GitHub - zswang666/Stereo-LiDAR-CCVNorm: Implementation of "Stereo and LiDAR Fusion using Stereo Matching Network with Condition
Implementation of "Stereo and LiDAR Fusion using Stereo Matching Network with Conditional Cost Volume Normalization" - zswang666/Stereo-LiDAR-CCVNorm
github.com
Structured Light
카메라 두 대가 아닌 카메라&빔프로젝터 구조이다.
독특한 패턴을 쏘아내고 카메라에서 해당 패턴을 촬영해 코스트를 검출하는 방법이다.
매우 정교하게 대응점을 검출할 수 있고 라이다 수준의 정교한 정보를 추출할 수 있다.
미켈란젤로상 복원 사례
https://accademia.stanford.edu/mich/
The Digital Michelangelo Project
Recent improvements in laser rangefinder technology, together with algorithms developed at Stanford for combining multiple range and color images, allow us to reliably and accurately digitize the external shape and surface characteristics of many physical
accademia.stanford.edu
'전공 > vison&ai' 카테고리의 다른 글
행렬식과 Eigenvalue & Eigenvector (0) | 2025.03.05 |
---|---|
[선형대수] Linear Transformation (0) | 2025.02.11 |
[선형대수] Gram-Schmidt process와 QR 분해 (0) | 2025.02.10 |
[컴퓨터 비전] 카메라 모델과 파라미터의 이해 (0) | 2025.02.09 |
인공지능을 위한 선형대수 & 확률과 통계 (0) | 2025.02.04 |
- Total
- Today
- Yesterday
- 알리익스프레스
- 카카오페이
- 오블완
- 맛집
- 방어동작
- f-91w
- 북문
- 계산방법
- 타란튤라
- 방향장
- 리브엠
- 경북대
- 메쉬 밴드
- 10만포인트
- 교체
- 할인
- 리브모바일
- 알뜰폰요금제
- 문서 스캔
- 카시오
- 알뜰 요금제
- 네이버페이
- Liiv M
- 티스토리챌린지
- f-94w
- 시계 줄
- a모바일
- 파스타
- 배송기간
- mealy
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |