'Developer/OpenCV'에 해당되는 글 29건

  1. 2013.01.24 객체 움직임 추적 - 혼-셩크, 블록매칭, 평균이동(MeanShift)

※ 옵티컬 플로우, 피라미드-루카스 카나데관한 설명[이동]


혼-셩크 방법

이 기법은 밝기 항상성 가정을 이용하여 기본적인 밝기 항상성 수식을 유도한 초기 방법


cvCalcOpticalFlowHS

 void cvCalcOpticalFlowHS(

        const CvArr* prev,                    //이전프레임 영상(8비트 단일 채널영상)

        const CvArr* curr,                    //현재프레임 영상(8비트 단일 채널영상)

        int use_previous,                    

        CvArr* velx,                 

        CvArr* vely,

        double lambda,

        CvTermCriteria criteria               //알고리즘의 종료조건

);

user_previous인자는 이전프레임에서 계산된 velxvely속도를 새로운 속도로 계산하기 위한 초기 시작점으로 사용할지를 알려주는 역할

lambada는 라그라지 승수와 완련된 가중치로, 라그라지 승수는 부드러움 제약조건과 움직임-밝기 수식을 모두 다 최소화하는 해를 구하고자 할때 사용된다.



블록매칭 기법

영상을 블록이라고 나누어 동작하는 알고리즘이다

블록매칭 알고리즘은 이전 프레임과 현재 프레임을 모두 블록으로 나눈뒤 블록의 움직임을 계산한다.

OpenCV에서는 블록들 사이의 비교를 위해 원본 블록위치에서 시작하는 나선탐색 방법을 이용한다. 충분히 좋은 매칭이 발견되면 탐색은 중단


cvCalcOpticalFlowBM

 void cvCalcOpticalFlowBM(

        const CvArr* prev,

        const CvArr* curr,

        CvSize block_size,     //사용되는 블록의크기

        CvSize shift_size,     //블록구성이 겹쳐져 있는지, 얼마나 겹쳐졌는지 알려줌

        CvSize max_range,      //블록이 다음 프레임에서 검색할 주변영역의 크기

        int use_previous,      //1 설정시 velx vely 저장된 값을 블록탐색을 위한 시작위치로 사용

        CvArr* velx,           //32비트 단일 채널로 블록매칭으로 계산된 움직임 정보저장

        CvArr* vely                  

);




평균-이동 알고리즘(MeanShift)

평균이동 방법은 컴퓨터 비전 분야를 포함한 많은 응용프로그램에서 데이터 분석을 위해 사용되는 일반적인 기법

데이터 집합의 밀도 분포에서 지역극값을 찾아내는 강인한 방법이다.


평균-이동 알고리즘 동작순서

1. 탐색 윈도우를 결정한다

- 초기위치

- 형식-균일, 다항, 지수, 가우시안

- 모양:대칭 또는 뒤틀림여부, 회전, 둥근 혹은 직사각형

- 크기 : 유효범위

2. 윈도우 내에 데이터들의 무개 중심을 구한다.

3. 윈도우의 중심을 무개 중심위치로 옮긴다.

4. 윈도우가 움직임을 멈출대까지 2번 단계부터 반복한다.


윈도우 내에서 계산된 무개중심으로 평균-이동 윈도우를 이동시키는 백터를 평균-이동 백터라고한다. 이러한 이동으로 인하여 윈도우 아래 존재하는 데이터들이 바뀌게 되고, 반복적으로 중심 이동 작업이 수행된다. 중심이동이 반복되면 평균-이동 백터가 0이 되는 경우가 생기고 이때가 알고리즘이 수렴하는 순간이다. 윈도우가 마지막에 위치한 곳이 데이터 분포의 지역 최대값 위치이다.  뭔말인가;;;


OpenCV에 구현된 평균-이동 알고리즘은 밀도 분포를 분석할 용도의 영상을 입력받는다. 입력영상은 2차원 공간에서 점들의 밀도를 측적하기 위한 용도의 2차원 히스토그램으로 인식된다. 이를 이용하여 관심 있는 특징 집합의 움직임을 추적할 수 있다.


cvMeanShift()

 void cvMeanShift(

        const CvArr* prob_image,      //확률적인 위치 분포(byte, float 타입영상)

        CvRect  window,               //커널 윈도우의 초기위치와 크기

        CvTermCriteria criteria,      //평균-이동 알고르짐 반복 연산 종료조건

        CvConnectedComp* comp         //함수의 실행결과

);

CvConnectedComp 구조체 포인트변수 comp는 함수의 실행결과를 담고있다. 수렴된 최종 윈도우의 위치는 comp->rect에 저장되고, comp->area에는 윈도우 내부의 모든 픽셀들의 합을 담고있다.


cvMesanShift()함수는 사각형 윈도우를 이용한 평균-이동 알고르짐이 지만 적을 위해서 사용될수 있다.

객체의 특징(색상+질감)을 선택하고 객체로부터 추추로딘 특징분포 위에 평균-이동 윈도우를 위치시킨다.

비디오 다음 프레임에서 선택된 특징분포가 빌집한 곳을 찾는다. -> 이곳이 해당객체가 있는곳




캠시프트 알고리즘

캠시프트 알고리즘은 평균-이동 알고리즘에 비해 윈도우가 스스로 크기를 조정한다는 점에서 다르다. 

ex) 얼굴 특징을 이용하여 추적하는 경우 카메라로부터 사람이 가까워지거나 멀어짐에 따라 얼굴크기에 맞게 자동으로 윈도우 크기를 변환한다.

 void cvCamShift(

        const CvArr* prob_image,

        CvRect  window,

        CvTermCriteria criteria,

        CvConnectedComp* comp,

        CvBox2D* box=NULL

);

box값이 NULL이 아니라면 크기 변경된 사각형 영역이 저장된다. 또한 2차 모멘트를 이용하여 구해진 객체의 방향도 저장된다. 




Posted by No names
,