[컴퓨터 비젼] CV-08 Stereo Vision

jungizz_·2023년 12월 7일

Computer Vision

목록 보기
8/8
post-thumbnail

1.

Background

  • 한 이미지 = 3D 공간을 projection한 결과
    -> projection할 때 depth로 크기만 결정하고 없앰
    -> 이미지에서 depth를 알아낼 수 있을까?

사람의 depth perception

  • 두 눈, 두 귀 -> 공간감/입체감 -> 두 개의 다른 정보를 합성하여 이해하기

stereo vision

  • 카메라 두 대를 사용해서 depth를 알아내기
    • 시야각이 다른 두 이미지를 조합하여 depth 찾기
  • 한 이미지로만 depth를 알지 못하는 이유
    : 3D 공간에서 다른 두 점이, pp에 같은 점으로 projection되는 경우, depth를 알 수 없음

Monocular cues to depth

  • 사람이 한 눈으로 봤을 때 파악하는 깊이는 두 종류
    • Absolute depth cues
      • 절대적인 실제 깊이
    • Relative depth cues
      • 상대적인 깊이 (무엇이 앞에잇는지..)

사람의 Relative depth perception (Monocular)

  • Occlusion
    • 사람은 두 개 이상의 물체가 어떤 관계(ex Occlusion무엇을 가리는가; 장면의 구조)를 보고 depth를 알아낼 수 있다
  • Texture
    • 동일한 texture가 반복되는 경우, texture의 변화(크기, 방향)로 depth를 알아낼 수 있다
    • ex) 일정한 밀도를 가진 딸기씨 -> 딸기씨의 밀도로 reconstructure (딸기씨 밀도가 낮아지면 가깝다)
  • Shading
    • 조명의 방향에 따라 밝기 변화
    • 빛에 따른 기울기(변화도)를 파악하고 적분하면 깊이
      -> shapeformshading
  • Shadows
  • Inter-refections (서로 반사)
  • Perspective effects
    • line을 보고 어디가 멀어지는지 추측 가능
  • Atmospheric
    • 멀리 있는 것은 공기층에 의한 빛의 산란 현상으로 뿌옇게, 흐리게, 밝게 보임
  • horizon line
    • 수평선에 가까운 것은 머니까 작게보임
    • moon illusion (수평선과 상관없이 달의 크기는 동일함; 수평선과 가까운 달은 멀 것이다 -> 커보임, 수평선과 먼 달은 가까울 것이다 -> 작아보임)

사람의 Absolute depth perception (Monocular)

  • Familiar size
    • 물체의 크기를 알고있는 경우

Conflicting

  • Perspective vs Familar size
    • 벽선, 물체의 크기 등으로 평평한 perspective가 느껴지는 상태에서 familar size가 어색하게 느껴지는 상황이 존재하곤 함(상충됨)
  • Scene vs Objects
    • 배경 인식: 사과가 크게 느껴짐
    • 물체 인식: 배경이 작게 느껴짐
  • Texture surface layout -> wrong recognition of absolute scale

others

  • (not mococular) 물체의 Motion을 찍은 여러장의 이미지로 depth를 알아낼 수 있다 (shape from motion)
  • (not human, in camera) 고정된 카메라에서 focus를 바꿔가며 찍은 것들의 선명해진 곳을 파악해 depth 알아냄 -> depth from focus

Stereopsis: Multi-view in human

  • not monocular
  • Stereopsis: 두 눈으로 입체적인(depth) 지각을 하는 과정
  • fovea: 디테일한 정보를 알 수 있는 시야
  • 사람은 초점을 맞추기 위해 회전하고, 이 때의 수정체 텐션을 기억하여 얼마나 멀리 있는지 추측할 수 있다
    • 물체에 따라 visual angle이 다르다-> Disparity

Stereo: Multi-view in camera

  • 상관관계를 알고있는 두 개 이상의 static한 카메라 (또는 motion을 알고있는 한 카메라로의 dynamic 촬영)를 사용해 depth 측정
    -> shape from motion between two views: Stereo
    • "shape from X:
      • X: shading, texture, focus, Motion...
      • shading, texture, focus 등은 조건과 미리 알고있어야하는 정보가 많음
        -> Motion으로 해보자!

Stereo

  • 다른 시각을 가지는 이미지들로부터 3d shape 추정
  • 두 pp에서 같은 물체로의 ray가 만나는 점이 실제 3차원에서의 위치
  • consider:
    • 카메라 위치, 상관 관계 (calibration)
    • 각 이미지의 동일한 점 (matching)
      camera calibration: The process of computing the camera parameters

Camera parameters in Stereo

  • extrinsic: 두 카메라의 R, T 차이점
  • interinsic은 같다고 가정

Geometry for a simple stereo system

  • 카메라 2대가 x축으로 translation 차이만 존재하는 상황에서 Depthz 구하기
  • 두 삼각형의 닮음비 사용
  • 이때, xrxlx_r-x_l = Disparity (카메라를 이동했을 때, 한 피사체가 이미지에서 움직인 양)
    • depthZ는 T, f, disparity에 영향을 받는데, T와 f는 카메라 세팅에 따라 정해진 값이므로 disparity가 중요하다
  • Disparity가 커지면, 분모 커짐, Z 작아짐
    -> 카메라를 이동했을 때, 한 피사체가 이미지에서 많이 이동했다면 가까운 물체이다

Disparity

  • 카메라가 움직일 때, 멀리있는 것과 가까운 것의 이미지 상에서의 움직임 속도 차이가 존재함을 알 수 있다
    • ex) 차에서 건물들은 빨리 움직이고 산은 천천히 움직임
  • 가까운 것은 disparity가 크고1, 먼 것은 disparity가 작다0-> 두 이미지에서 corresponding point를 찾았다면 Disparity로 상대적인 깊이를 알 수 있다⭐

    Stiching에서 Disparity와 translation의 관계

    • 거리가 다른 두 물체가 한 이미지에 같이 있는 경우
    • 카메라가 이동하여 translation이 발생하면 disparity가 0보다 커지고, 두 물체의 이미지상의 속도가 달라 가려지는 부분이 발생할 수 있다 -> 대응점 찾기 어렵다
    • translation하지 않고 rotation만 적용했다면 T=0, disparity=0이므로 대응점을 찾기 수월하다
      (12/8 녹강 4분대.. 이해 잘 안댐)

Stereo matching algorithm: window-based matching

  • 두 stereo 이미지는 x축으로만 translation됐다는 성질 이용
  1. 한 이미지의 점x에서 window 설정
  2. 그 window를 다른 이미지의 scanline을 따라 이동시키며 best match x'을 찾는다
    • SSD나 normalized correlation을 사용해 best match를 찾음
    • 하지만 두 이미지의 밝기를 유지시키기 어려운 photometric 차이가 있으므로 correlation을 사용하기도 함
  3. x-x'으로 disparity 계산
  4. Depth 계산
  • 위와 같은 계산은 이전 corresponding point를 찾던 2차원 방법을 1차원으로 풀 수 있게 해줌

window size and desparity map

  • window 크기가 작으면
    • 작은 window와 비슷하게 생긴 부분이 많아 noise가 생길 수 있음
    • more detail, more noise
  • window 크기 크면
    • 특정 점의 depth만 찾고 싶은데 주변 픽셀의 영향이 커서 디테일이 부족해짐
    • less detail, smoother disparity map, rough
    • optical flow의 window 문제와 비슷하게, window 안에 다른 depth를 가진 픽셀이 존재하여 best match를 찾기 위해 계산할 때 그 중간의 depth를 찾게되며 smooth 효과
    • 아래 사진에서 나무가 앞에 있는 건 알지만 나무 모양은 알기 어려움
  • Texture less surface
    • 텍스쳐가 없는 배경
  • Occlusions
    • 한 씬에 가까이 있는 물체와 멀리 있는 물체가 겹쳐있는 경우
    • 거리가 달라 이미지 상의 속도가 다른 두 물체의 겹쳐짐 때문에 보이는 모습이 달라지면 일치하는 점이 존재하지 않을 수도 있다
    • 창들과 사람 겹치는 부분
  • Repetition
    • 같은 부분이 반복되는 경우
  • Non-Lambertian surface
    • 바라보는 방향에 따라 highlight(specular)가 이동하는 경우
      -> bright constancy X

Problem of window-based matching

  • 두 카메라를 평행하게 맞추는 것과, 밝기, focal length등을 동일하게 맞추기 어려움
  • 정확한 depthz를 찾으려면 disparity가 큰 것이 좋다 (오차 줄이기)
    • disparity = fT/Z로 식을 변형하였을 때, f와 T에 비례
    • f는 고정이므로, T가 커지는 것이 좋다
      -> 하지만, 카메라 이동이 많이되면 같은 피사체가 이미지에 보이지 않는 경우가 생길 수 있음 (가까울수록 심함)
  • sol: 카메라 회전까지 추가하여 가운데로 모이도록...

2.

Pinhole camera geometry

  • 삼차원 공간에서의 점 x0, y0, z0이 t만큼 이동했을 때 직선x(t), y(t), z(t)을 화면에 perspective projection해서 나타난 화면 상의 직선 x'(t), y'(t)
    (f는 scale)
  • 삼차원 공간에서 parallel하면 projection한 image plane에서도 parallel 하다.
    • ex) 벽돌 정면 사진의 line -> z0, y0이 변하지 않아 y'(t)도 변화 없음 -> 사진 상에서도 parallel

Calibration: homogeneous transform

  • homogrnrous coord에서 extrinsic과 intrinsic 합치기
  1. world coord에 extrinsic matrix 곱해서 camera coord로 변환
  2. camera coord에 intrinsic matrix 곱해서 pixel coord로 변환
    • M: intrinsic * extrinsic
  • p=Mpwp=Mp^w는 아래와 같이도 표현할 수 있음
    • M의 row vector
    • 행렬의 곱을 dot product로 표현

Calibrated camera: Stereo correspondence constraints

  • 위에서 했던 것처럼 x축으로 translation만 한 경우에는 corresponding point를 찾기 쉬움
  • 하지만 rotation까지 추가된 경우, 간단하지 않음(calibrated camera)
    • 이동 전 점p의 ray상에 존재할 실제 피사체
    • 이동 후 점p'은 그 피사체를 지나는 ray와 pp가 만나는 점
      -> 실제 피사체 위치가 확실하지 않으므로, 그 피사체를 지나는 ray를 여러개 그릴 수 있고, 그 ray와 pp의 교선epipolar line으로 나타난다
      -> 이동 후 점p'은 교선 위에 존재한다
      -> 이것이 epipolar geometry

Epipolar geometry

  • 조건: corresponding pixel은 이동 전과 이동 후 이미지 둘 다에 항상 등장 (사라지지 않는다)
  • 위의 과정을 반대로도 생각하면, 각 pp에 epipolar line이 그려지고, 그 때의 평면이 epipolar plane이다
    • epipolar plane은 ray를 포함하고 세 픽셀을 지나는 평면
    • epipolar plane과 pp와의 교선이 eplipolar line
  • depth와 상관없이, 한 카메라의 epipolar line에 존재하는 점이면 그 점은 다른 카메라의 eplipolar line에 존재
  1. 두 카메라의 CoP를 연결하여 Baseline 생성
  2. Baseline과 pp가 만나는 점 Epipoles 지정
    • Baseline과 epipoles는 물체의 위치나 픽셀 상관 없이 정해지는 값 (카메라만 정해지면 구할 수 있음)
  3. world coord의 피사체 위치 P를 지정한다면 Epipolar plane 생성 가능 (Baseline과 P 연결)
  4. Epipolar plane과 pp의 교선 Epipolar Lines 지정
  • 모든 epipolar line은 epipole을 지난다
  • epipolar plane은 두 epipolar lines을 지난다

Epipolar constraint

  • 한 이미지에서의 점p의 실제 위치P를 지정한다면, epipolar plane을 사용하여 elipolar line 중 한 점p'을 지정할 수 있다
    • p의 corresponding point는 항상 l'에 존재
    • p'의 corresponding point는 항상 l에 존재
      -> 대응관계
    • 한 epiporlar line에 존재하는 점들의 대응점은 다른 epiporlar line에 존재
  • 이전에는 corresponding point를 찾기 위해 이미지 전체를 확인하는 3차원 문제였는데, 이제는 disparity를 활용해 부분적으로 찾을 수 있는 1차원(line에서 한 점 찾기)문제가 됨
    -> 한 점의 potential match(대응될만한 점)이 line에만 존재하니까 search space가 줄어듦

example

  • Converging camera: 같은 물체를 다른 각도에서 본 경우(RT변화)
    • 각 점의 epipolar line은 baseline을 중심으로 회전 (모든 epipolar line은 epipole을 지나니까)
  • motion parallel: x축 translation만 한 경우, 평행한 epipolar line이 나옴
    • 다른 점을 기준으로 살펴봐도 계속 평행

Geometry -> Algebra

  • 기하학적으로 epipolar를 이해했으니, 식으로 나타내보자 (epipolar line만)
  • 카메라의 RT를 알고 있을 때, camera1 coord의 점에 RT를 적용하면 camera2 coord의 점이 나온다
    • X: world pointX의 camera1 coord (초록 벡터) (image plane 생각하지마)
    • X': world pointX의 camera2 coord (노랑 벡터)

matrix로 나타낸 cross product

  • a, b 외적의 결과는 a, b 평면에 수직인 벡터 c
  • b와 곱했을 때 c와 같은 결과를 나타내주는 a로 이루어진 행렬을 사용해 cross product를 나타냄
  • X는 camera1 coord의 점 x를 나타내는 벡터, X'은 camera2 coord의 점 x'을 나타내는 벡터
  • 벡터X에 RT를 적용해 벡터X'으로 만듦
  • 양변에 T를 외적하면 TxX'으로 epipolar plane과 수직인 벡터를 구할 수 있고, (TxT는 공통 수직이 없으므로 0)
  • 그 벡터와 x'은 수직이므로 양변에 x'을 내적한 결과는 0이 나와야함
  • 위 식의 우변 cross product를 matrix로 변형하고 (알고있는 T를 행렬로 바꿈) 그 부분을 E로 나타냄
  • image plane의 점 x와 x'를 나타내는 homogeneous coord(ray)를 pp'이라고 하면
    • 위의 식을 적용시킬 수 있다
      -> 카메라 뿐만 아니라 homogeneous coord(Ray)에도 적용되는 식
위 식을 역으로 하여 RT를 알아내는 과정이 stereo camera calibration

Essential matrix

  • 위 식에서 E를 essential matrix
    • 두 카메라의 RT의 관계를 나타내는 행렬 -> Extrinsic
      (Intrinsic parameters는 알고있다고 가정하고 essential matrix를 사용)
    • 이미지의 점과도 관련있는 행렬이다!
  • essential matrix를 구하는 것이 camera calibration
    • 알고있는 RT로 E를 구하거나
    • 고정된 카메라에서 움직여가며 최적화된 E를 구할 수 있음

Essential matrix and epipolar line

  • 한 이미지의 점의 homogeneous coordp와 다른 이미지의 점의 homogeneous coord p'는 아래 식을 만족
  • 위의 식으로 epipole line의 조건식을 만들 수 있다
    • 점 p'가 정해졌을 때, p'의 대응점이 존재하는 line은 위의 식을 만족하는 p들의 집합 (ETpE^Tp'와 수직인)
    • 점 p가 정해졌을 때, p의 대응점이 존재하는 line은 위의 식을 만족하는 p'들의 집합 EpEp와 수직인)
  • 아래는 기하학적 설명...인데 어려웅
  • cross product 형태로 보면 line이 나온다 (두 점을 외적하면 두 점을 지나는 직선)
    • EpEp : 점 p를 포함하는 epipolar line을 나타내는 coordinate vector
    • ETpE^Tp' : 점 p'을 포함하는 epipolar line을 나타내는 coordinate vecotr
      (강노에 적힌건데 먼말)
  • Essential matrix로 epipolar line을 무한히 만들 수 있다
    • 벡터 pETpE^Tp'를 내적하면 0이므로, ETpE^Tp'p와 수직
      -> 벡터 p는 여러개이고, 이 모든 벡터들과 공통적으로 수직인 ETpE^Tp'epipole plane을 나타내는 normal
      • ETpE^Tp': 오른쪽 camera coord에서 본 epipole plane의 normal
      • pp: ETpE^Tp'와 수직인 벡터들의 집합 -> p'에 대한 epipole line
        -> 점 p'가 정해졌을 때, p'의 대응점이 존재하는 line은 위의 식을 만족하는 p들의 집합
    • (반대)벡터 p'을 기준으로 하면 EpEp는 왼쪽 camera coord에서 본 epipole plane의 normal

example: parllel camera

  • x축으로 translation만된 카메라
    • rotation 없으므로 R=I
    • x방향으로 -d만큼 움직였으므로 T=[-d, 0, 0]^T
  • E는 아래와 같이 나타난다
  • E를 사용해서 epipolar line 계산
    • epipolar line의 조건: y=y'(y값이 같은 line)
    • y값이 같은 line이 epipolar line이므로, corresponding point는 같은 horizontoal line에 존재함을 알 수 있다
      -> image scanline = epipolar line

Stereo image rectification

  • 위의 예시처럼, 두 이미지가 평행하면 계산이 간편
  • parallel하지 않은 두 이미지가 평행할 수 있도록 가상 pp로 reprojection하여 x축으로 평행이동 한 것처럼 만든다
    -> Epipolar line이 수평이 되며, 대응점 찾을 때 같은 높이의 scanline에서 찾으면 된다
  • perspective transform (homography)으로 rectification

Matching

  • 두 epipolar line에서 대응점을 찾는 방법
    1. Window based method -> SSD, NCC point to point
    2. Scan-line Stereo scanline to scanline
  • matches를 찾기 위한 조건:
    • scene point가 두 이미지에서 보여야 함
    • Similarity: matches 영역이 비슷하게 보여야 함

Intensity profiles

  • 대응점을 찾기 위해 점을 찾는 것이 아닌, 라인을 찾는 문제!
  • 두 epipolar line의 관계를 보면 밝기 양상이 똑같다.
  • textureless 부분도 찾을 수 있다
  • 하지만, 밝기를 사용하므로 노이즈에 예민
  • sol: window based(NCC), scan-line stereo
  • Dense(전체): 한 대응점을 찾기 위해 라인 탐색
    • scanline 전부 탐색하여 매칭
  • Sparse(일부): 한 대응점을 찾기 위해 한 점 탐색
    • feature로 동일점 찾기

1. Window based: NCC(Normalized cross correlation)

  • window를 사용해서 대응점을 찾는 방법은 SSD와 NCC
    • stereo에서는 보통 두 카메라를 사용하고, 동일한 노출값을 주기 어려우므로 photometric한 차이가 있어 NCC를 주로 사용
  • a와 b의 내적을 normalize
  • 범위가 [-1, 1]이 된다
  • 이미지의 전체 밝기 상관 없이, 밝아지는 방향/정도를 파악하여 대응점을 찾기 위해 정규화한 것
  • 각 region의 픽셀값을 벡터 형태로 만듦 (아래 그림은 12차원의 벡터)
    • 벡터 길이: 밝기 정도
    • 벡터 방향: 밝기 방향, 모양 (밝은 쪽을 향함)
    • 정규화를 하면 벡터 길이는 같아지므로 전체 밝기는 신경쓰지 않을 수 있고, 정규화된 벡터의 방향만 비슷하면 대응점
    • 벡터 방향의 비슷한지 확인하기 위해 내적
      -> 비슷하면 1, 다르면 작은 값

Problem of window based correspondence

  • Textureless한 부분에서 대응점 찾기 어려움
  • window 크기의 영향을 많이 받음 (위에 적힌 것)
  • sol: 조건을 추가해서 scanline stereo 사용

2. Scan-line Stereo

Correspondence constraints

  • scanline stereo를 사용해 대응점을 찾기 위한 epipolar geometry의 constraints
  1. Uniqueness
    • 한 점에 대한 대응점은 1개(one pixel to one pixel)
  2. Ordering
    • 연속적으로 생긴(같은) 물체의 대응점의 순서는 바뀌지 않는다
    • 바뀌는 경우도 있긴하지만~ 고려하지 않음
  3. Disparity gradient
    • disparity가 급격하게 변하지 않을 것이다
    • 한 점의 대응점을 선택할 때, disparity가 작은 점 선택
  • 각 픽셀에 대해 independent(loca)하게 수행하던 window 방법과 다르게, 위의 조건(non-local constraint)이 들어가 픽셀들의 dependent한 성질(coherence)를 고려하여 매칭
  • dynamic programming으로 scan-line stereo의 shortest-paths를 구한다

Shortest path with Dynamic programming

  • Occlusion으로 가려진 것을 고려하며 매칭
  • 세로는 왼쪽 이미지의 픽셀 나열, 가로는 우측 이미지의 픽셀 나열
  • 각 셀은 매칭되는 픽셀이 얼마나 유사한지를 나타냄 (밝기 차이 + 올 수 있는 세가지 방향의 픽셀과의 차이 중 최소값)
    • Correspondence:
      • 알맞게 찾아진 매칭 -> 그래프에서 대각선으로 이동
    • Right Occlusion:
      • 오른쪽 이미지에는 있는데, 왼쪽 이미지에는 가려져서 안보이는 픽셀
      • 오른쪽 이미지의 다음 픽셀과 연결을 시도 -> 그래프에서 오른쪽으로 이동
        (left 변화x, right 변화o)
    • Left Occlusion:
      • 왼쪽 이미지에는 있는데, 오른쪽 이미지에서는 가려져서 안보이는 픽셀
      • 왼쪽 이미지의 다음 픽셀과 연결을 시도 -> 그래프에서 왼쪽으로 이동
        (right 변화x, left 변화o) (음의 disparity)
    • 오른쪽, 왼쪽으로 이동한 거리는 disparity
  • 3가지 방향 중 밝기 차이가 가장 작은 값으로 이동하여 컴퓨터가 occlusion을 고려해 매칭하는 것
  • 그렇게 찾은 path는 누적된 error가 가장 작은 path, error가 최소가 되는 매칭 -> shortest path
  • 그리고, disparity를 알면 depth를 구할 수 있는 것이다~
  • 위에서 추가한 조건때문에 3가지 방향으로만 갈 수 있음 (위, 왼쪽으로는 못감!)

Streaking artifacts problem

  • scanline stereo는 scanline(가로선)만 보고 구하므로
  • 결과에 가로선 형태 streaking과 scanline 주변으로 퍼져보이는 결과가 나타남

as enery minimize

  • 대응점을 찾기 위한 E를 설정하고 (작을수록 좋은 energy) E를 최소화하는 문제로 해결
  • 첫째 항은 disparity만큼 움직였을 때의 차이로 대응점을 잘 찾았는지를 나타냄
    • 차이가 안나야지 같은 점이므로 최소가 되도록 해야함
  • 두번째 항은 결과가 부드럽게 나왔는지 확인하는 것
    • 자신 주변 disparity와 차이가 크면 noise가 있다는 것이므로 최소가 되도록 해야함
    • noise 없이 잘 움직였다면 주변 움직임 양상도 비슷하여 disparity도 비슷할 것이다

Active stero with structed light

  • textureless한 부분의 대응관계를 찾기 위해 프로젝터로 structed light를 쏴서 texture가 나타나도록 함
    • dynamic programming에서는 textureless한 부분은 그냥 linear하게 만들었고, 이 오류로 인해 망가질 수 있음
profile
( •̀ .̫ •́ )✧

0개의 댓글