연구실에서 하던 프로젝트들의 대부분이 거의 완벽하게 시연이 되고 있구나...
역시 어도브다 ㅋㅋ



Augmented Reality 관련 영상인데
best paper 를 먹을만 하군요.
이거원 트래킹서부터 해서 인식이 너무 잘되는구만...


Best Paper Award:
Georg Klein and David Murray.
"Parallel Tracking and Mapping for Small AR Workspaces"



Best Student Paper Award:
Denis Kalkofen, Erick Mendez, and Dieter Schmalstieg.
"Interactive Focus and Context Visualization for Augmented Reality"

Honorable Mention Award:
Cindy M. Robertson and Blair MacIntyre.
"An Evaluation of Graphical Context as a Means for Ameliorating the Effects of Registration Error"


모든 m×n 행렬 A은 다음과 같이 분해할 수 있다.

A = UΣVT

Um×m 직교 행렬(orthogonal matrix)이고, Vn×n 직교 행렬이다. m×n 행렬인 Σ는 대각선에만 그 값이 있는데, 0 또는 양수이다. 이 값을 특이값(singular value)이라고 한다. 고유값-고유벡터 분해(eigenvalue-eigenvector decomposition)

A = QΛQT

는 대칭 행렬(symmetric matrix)에 대해서 먹히는 반면에 (사실 충분 조건이다. 필요충분조건을 말하려면 너무 길어지니깐...) , SVD는 모든 행렬에 대해 (정방행렬이 아니더라도) 써 먹을 수 있는 만능이다.

행렬 A를 벡터 공간(vector space) 간 선형 사상(linear mapping)으로 보면 (엮인 글을 참고하시오), s = min(m, n)

y = Ax = UΣVTx = (v1Tx1u1 + ... + (vsTxsus

위 식에서 {vi} 를 입력 공간의 직교 베이스(orthogonal basis)로 보고 {ui} 를 출력 공간의 직교 베이스로 볼 수 있다. 그러면 viTx 는 입력 벡터 x 를 베이스 {vi} 에 대해 표현할 때의 좌표이다. 그리고 출력 벡터 y는 베이스 {ui}의 선형 조합(linear combination)으로 표현되는데 각 계수는 대응하는 입력 좌표와 특이값의 곱이다. (넓은 의미로 decouple 되었다고 볼 수 있다.)


사용자 삽입 이미지

0이 아닌 특이값이 r 개라고 하고 그것을 내림차순으로 정렬하자. 즉,

 σ1 > σ2 > ... > σr

그러면 {u1, ..., ur}이 칼럼공간(column space)의 베이스가 되고, {vr+1, ..., vn}은 영공간(null space)의 베이스가 된다. (위 식과 그림을 유심히 보라.)


이제 선형 방정식의 풀이에 대해 생각해 보자.

Ax = b

아까는 x가 주어지고 y를 구하는 것을 생각했지만, 이제는 y = b가 주어지고 그것을 충족하는 x를 찾는 문제다.

UΣVTx = b

x = -1UTb

위 식에서 Σ-1는 {1/σi}가 대각선에 있는 n×m 행렬이다. 위 식만 놓고 보면 말이 안된다. 하지만 그 위의 풀어 헤쳐 놓은 식을 보라. 그러면 말이 된다. 그렇기 때문에 Σ+란 기호를 쓴다.

위 식에서 UTbb를 칼럼 공간 {u1, ..., ur}에 투영(projection)하는 것이다. (r 보다 큰 칼럼은 Σ-1이 지워주므로 위 명제에 대해 걱정하지 말라.) 그리고 -1x 중 영 공간(null space)에 있는 벡터 성분을 0 벡터로 바꿔준다. 입력 공간과 출력 공간 모두에 대해서 최소제곱해(least-square solution)을 제공한다.

x = +UTb = A+b

위 식에서 A+ = +UTA의 pseudo-inverse라고 한다.

int main(){
  IplImage *imgA = cvLoadImage( "image1.jpg", 1);
  IplImage *imgB = cvCreateImage( cvGetSize( imgA), IPL_DEPTH_8U, 3);
  const double angle  = 40.0; //회전각도
const double scale = 1.0; //크기 CvPoint2D32f center = cvPoint2D32f( imgA->width/2.0, imgA->height/2.0);//회전중심설정
CvMat *rot_mat = cvCreateMat( 2, 3, CV_32FC1);
cv2DRotationMatrix( center, angle, scale, rot_mat); // 메트릭스 변환
cvWarpAffine( imgA, imgB, rot_mat, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS); // 선형보간 cvSaveImage( "image_result8.bmp", imgB); cvReleaseImage( &imgA ); cvReleaseImage( &imgB ); cvReleaseMat( &rot_mat); return 0; }
  1. moodern 2009.01.15 16:00 신고

    얼~ 구글링했는데 여기가 나오네. 유용하게 써먹으마~

+ Recent posts