스테레오 대응 : http://lueseypid.tistory.com/113


두대의 카메라 입력영상에서 3D점을 찾아 매칭하는 스테레오 대응을 하기 위해서는 CvStereoBmState 구조체를 이용한다.]

스테레오 대응은 두카메라에서 겹치는 장면에서만 계산이 가능하다. 

그렇기 때문에 카메라들을 가능한 정면 평행하도록 설정하여야 좋은 결과를 얻을수 있다.


OpenCV는 블록-매칭 스테레오 알고리즘을 구현한 cvFindStereoCorrespondenceBM()함수를 제공한다. 

이 방법은 스테레오 조정된 왼쪽과 오른쪽 영상에서 대응점을 찾이 위해 윈도우 내부의 SAD를 계산한다.

※ SAD : Sum of Absolute Difference, 주어진 윈도우 내부에서 두영상의 픽셀값들의 차의 절대값을 모두 합한

이 알고리즘은 질감이 두드러진 점들을 매칭하는데 유용하게 사용된다.


블록-매칭 스테레오 대응 알고리즘 단계

1. 영상의 밝기를 정규화하고 질감을 향상시키는 전처리 과정

2. 수평 에피폴라 직선을 따라 SAD윈도우를 이동시키며 대응점 찾기

3. 잘못된 대응점들을 제거하는 후처리 과정


 typedef struct CvStereoBMState

{

        // 전처리과정 (입력영상 Normalization)

        int preFilterType; // =CV_STEREO_BM_NORMALIZED_RESPONSE now

        int preFilterSize; // averaging window size: (5x5) ~ (21x21)

        int preFilterCap; // the output of pre-filtering is clipped by [-preFilterCap,preFilterCap]

 

        // SAD 이용한 대응점 찾기

        int SADWindowSize; // (5x5), (7x7), (21x21)

        int minDisparity;  // minimum disparity (can be negative)

        int numberOfDisparities; // maximum disparity - minimum disparity (> 0)

 

        // 후처리 (나쁜 매칭결과를 제거함)

        int textureThreshold;  //유효한 SAD 응답의 최소값

        int uniquenessRatio;   // accept the computed disparity d* only if

        // SAD(d) >= SAD(d*)*(1 + uniquenessRatio/100.)

        // for any d != d*+/-1 within the search range.

        int speckleWindowSize; // 스펙클 윈도우 크기

        int speckleRange;             // 스펙클 윈도우 내에서 유효한 시차 변동 범위

 

        int trySmallerWindows; // if 1, the results may be more accurate,

        // at the expense of slower processing

        CvRect roi1, roi2;

        int disp12MaxDiff;

 

        // temporary buffers

        CvMat* preFilteredImg0;

        CvMat* preFilteredImg1;

        CvMat* slidingSumBuf;

        CvMat* cost;

        CvMat* disp;

CvStereoBMState;

CvStereoBMState구조체는 다음과 같은 맴버 변수들을 가지고있다.


CvStereoBMState구조체를 생성할때는 cvCreateStereoBmState()를 통해 변수를 생성하고

필요한 맴버변수를 직접 초기화를 한다.


일반적으로 아래와 같이 7개의 맴버변수를 초기화한다.

BMState->preFilterSize

BMState->preFilterCap

BMState->SADWindowSize

BMState->minDisparity

BMState->numberOfDisparities

BMState->textureThreshold

BMState->uniquenessRatio


BMState->preFilterSize - 전처리 과정

전처리 과정에서 영상들의 밝기 차이 영향을 줄이기 위한 정규화와 질감을 향상시키는 작업을 수행하기 위한 필터의 크기

전처리 과정이서 그런지 실제로 결과영상에서 큰영향을 미치는 요인은 아닌듯 하다.


BMState->preFilterCap - 전처리과정

전처리과정에 의해 잘려진 결과?


BMState->SADWindowSize

SAD윈도우의 크기



BMState->minDisparity, BMState->numberOfDisparities

대응점을 찾는 과정은 SAD윈도우를 이동시키면서 이루어진다. 왼쪽 영상에서 찾은 특징점들에 대하여 오른쪽영상에서 동일한 행에서 가장 잘 매치되는 점을 찾는다.조정이 된 후, 각각의 행이 에피폴라 직선이기 때문에 왼쪽 영상의 특징점과 동일한 행에서만 대응점을 찾으면 된다.

왼쪽의 특징점 좌표가(x, y)라면 이에 대응하는점은 x보다 작거나 같은 x좌표 위치에 나타난다(y좌표는 같음) => 음의 시차가 매칭된다.

minDisparity는 대응점 검출의 시작위치를 지정ㅎㅎ

numberOfDisparities 픽셀만큼 이동하면서 이루어진다.

최소시차와 시차 개수를 지정함으로써 호롭터를 설정할수 있다.

※ 호롭터 : 스테레오 알고리즘의 검색영역을 나타내는 3차원공간

※ 시차한도는 서로 다른 호롭터를 설정한다. 이 범위 바깥쪽에서의 깊이는 계산되지 않으며, 깊이지도에서는 구멍으로 표시 될것이다.

    카메라 사이의 기준선 거리 T를 작게 할수록, 초점 거리를 작게 할수록, 스테레오 시차범위를 키울 수록, 픽셀 너비를 키울수록 호롭터는 커진다.


BMState->textureThreshold

SAD응답의 최소값, 이 임계값이 높아지면 높아질수록 차이가 적은 부분에 대해서는 무시된다.



BMState->uniquenessRatio - 후처리 필터링

매칭 함수의 응답은 최소시차에서부터 치대 시차쪽으로 이동하면 나타난다. 보통 함수의 응답은 중앙에서 큰값을 갖는 형태로 나타난다. 

대응점 대응 후보를 선택하였다면 잘못된 매칭을 제거하기 위하여 후처리 과정이 필요하다. 이를 위해 uniquenessRatio를이용한다.

uniquenessRatio > (match_val - min_match)/min_match를 만족하는 매칭 결과를 걸러낸다. 


BMState->speckleWindowSize - 후처리 필터링

블록-기반 매칭은 객체의 경계에서 문제가 일어난다. 

매칭 윈도우가 전경 객체의 일부와 배경의 일부를 함게 덮을 수 있기 때문이다. 그결과 작은 영역 내에 크고 작은 시차가 발생한다.

이를 스펙클이라고 한다. 이러한 효과를 제거하기 위하여 스펙클 윈도우를 이용한 스펙클 검출기를 사용할 수 있다. 





'Developer > OpenCV' 카테고리의 다른 글

전경과 객체 분리  (1) 2013.08.08
매핑  (0) 2013.02.04
기본행렬, 필수행렬  (0) 2013.02.03
스테레오 영상  (0) 2013.02.01
어파인변환, 투시변환  (0) 2013.01.31
Posted by No names
,