물체의 유사성(correspondence) 찾기 - 수정중

  물체의 Correspondence(유사성)을 찾기 위한 접근 방법으로 크게 두가지 방법으로 분류할수 있다.

첫번째는 Feature에 기반한 방법, 두번째는 Area에 기반한 방법이다. Feature에 기반한 방법은 이미지에서 나타나는 feature(keypoint) - 추적하기 좋은곳(쉬운곳) 즉, edge나 corner점들을 이용해 매칭점을 찾아내는 방법이다. Feature에 기반한 방법은 속도가 빠르고 매칭점 들이 비교적 정확한 장점이 있지만, 하나의 feature로는 위치를 판별해 내기 어렵다. 하지만 Area에 기반한 방법은,  전체에 대한 dense 매칭에 대한 정보를 얻을수 있지만, 그에 따라 속도가 매우 느리고, Feature기반 방법보다 부정확한 단점이 존재한다.

 

Feature기반의 매칭점을 찾는 알고리즘의 순서는 보통 아래와 같은 순서로 진행된다.

 

 (1) 두 이미지로 부터 Feature점들을 추출한다.

 (2) 추출한 Feature점들을 이용해 근방 픽셀 밝기값을 물체의 orientation, descriptor를 구한다.

 (3) 두 이미지의 Feature점들간의 대략적인 Matching point를 찾는다.(KD-Tree, LSH...)

 (4) outlier 제거 한뒤 Inlier를 갖고 Homography를 추정한다.(RANSAC, PROSAC...)

 (5) H를 통해 두 이미지 간의 관계를 설정한다.

 

(3)의 과정에서 Feature keypoint점들 간에 대략적인 매칭을 위해서, 매칭되는 keypoint주위의 원도우 영역에

서 유사 정도를 가지고 대략적인 매칭을 수행한다. 대표적인 유사도 측정 방법은 SAD(Sum of Absolute

Differences), SSD(Sum of Squared Differences), NCC(Normalized Cross Correlation)등이 있다.

 

 

'컴퓨터비전/영상처리 > Non Library ' 카테고리의 다른 글

영상처리 색변환  (0) 2014.01.28

멀티스레드 개념 정리

프로그래밍/C/C++ 2014. 1. 28. 03:38

 CPU 코어 하나에 여러개의 스레드를 한 명령어씩 돌아가며 처리한다.

(OS가 각 스레드에게 CPU를 사용할수 있는 시간을 할당 즉 스케줄링 한다. 스케줄 순서에 따라 번갈아가며 수행된다)

 

void thread()
{
    int a = 0;
    int b = 0;
    a++; //명령문 1
    b++;// 명령문 2
    a += b; //명령문 3
}
이러한 쓰레드가 3개가 있다면,
코어
스레드 a의 명령문 1를 수행한다.
스레드 a의 스택정보와 레지스트 정보를 임시 저장한다.

 

스레드 b의 스택정보와 레지스트 정보를 불러온다.
스레드 b의 명령문 1를 수행한다.
스레드 b의 스택정보와 레지스트 정보를 임시 저장한다.

 

스레트 c의 명령문 1를 수행한다
스레드 c의 스택정보와 레지스트 정보를 임시 저장한다.

 

스레드 a의 스택정보와 레지스트 정보를 불러온다.
스레드 a의 명령문 2를 수행한다.

 

다시 스레드 b의...(이하 반복)
를 수행한다.

만약에 코어가 두 개가 있을시에는
상대방 코어가 처리하고 있지 않은 스레드의 명령문을 처리한다.

동적계획법

알고리즘 2014. 1. 28. 02:54

 동적 계획법은 문제를 분할하고 부분 문제의 해를 구한 뒤 구해야 할 해를 부분 문제의 해를 이용해서 구하는 방법이다. 이 때 부분 문제의 해는 배열에 기억시켜 놓은 뒤에 재활용한다. 분할 정복과 비슷하다고 생각할지 모르겠다.

아래의 글을 보고 둘 사이의 차이점을 이해해 보자.

 

▶분할 정복법과 동적 계획법을 이용한 n!구하기

1) 분할정복법

int fact(int n);
main()
{
	int n, k;
	table[1] = 1;
	scanf("%d", &n);
	k = fact(n);
}

int fact(int n)
{
	int i;
	if(n < 1) return 1;
	k = n * fact(n-1);
	return k;
} 

2) 동적계획법

void fact(int n);
main()
{
	int n;
	table[1] = 1;
	scanf("%d", &n);
	fact(n);
}

void fact(int n)
{
	int i;

	for(i=2; i <=n;  i++)
        	table[i] = i * table[i-1];
} 

 

 

              <동적계획법>

위의 펙토리얼 프로그램은 n!의 값을 분할정복법과 동적계획법의 과정을 나타낸다.동적 계획법을 이용한 프로그램은 최종 결과값을 만들기 위해 처음부터 하나씩 해결해서 배열에 넣는다. 그렇게 구한 값을 이용하여 최종 결과값을 얻게 된다. 

 

          <분할정복법>

 반면, 분할정복법으로 짜여진 프로그램은 값을 구하기 위해 부분 문제의 해를 구하고, 그 부분문제의 해를 구하기 위해 부분 문제의 부분 문제의 해를 구하는 방식으로 동작한다.

void table[100];
main()
{
	table[0] = 1;
	table[1] = 1;
	scanf("%d", &n);
	fi(n);
}

void fi(int n)
{
	int i;
	for(i=2; i<=n; i++)
        	table[i]:=table[i-1]+table[i-2];
}

 

피보나치 수열을 구하기 위한 점화식은 F(n) = F(n-1) + F(n-2) 이다. 배열을 이용하여 F(1) + F(2), F(2) + F(3), ..., F(n-1) + F(n-2)를 구하는 방식으로 값을 구하였다. 분할 정복법에서는 F(n) = F(n-1) + F(n-2)에서 시작하여 F(n-1)과 F(n-2)를 각각 구한뒤 마지막에 결과를 합치는 방식으로 문제를 푼다.

 

분할정복법 : 큰 문제를 부분으로 분할하여 각각의 부분 문제를 해결한뒤 결과를 모음

▶ 동적계획법 : 작은 문제를 하나하나 계산하여 원하는 결과에 도달