Performance Profiling

학술 2010. 10. 25. 10:11 Posted by 양고
대략 이와 같이 하면 편함.

 int j = 0;
 LARGE_INTEGER freq, t[20];
 QueryPerformanceFrequency(&freq);
 QueryPerformanceCounter(&t[j++]);
// warp
 cvWarpPerspective(iObj, iPred, &_homography); // takes 10ms !!
 QueryPerformanceCounter(&t[j++]);
 printf("warping: %g ms\n", (t[j-1].QuadPart - t[j-2].QuadPart)*1000./freq.QuadPart);
// ...







점과 선, 선과 선 사이의 거리

학술 2010. 10. 20. 23:59 Posted by 양고
출처: http://mathworld.wolfram.com/Point-LineDistance2-Dimensional.html

1. 점과 선의 거리 (2D)

PointLineDistance2DVec

If the line is specified by two points x_1=(x_1,y_1) and x_2=(x_2,y_2), then a vector perpendicular to the line is given by

 v=[y_2-y_1; -(x_2-x_1)].
(12)

Let r be a vector from the point x_0=(x_0,y_0) to the first point on the line

 r=[x_1-x_0; y_1-y_0],
(13)

then the distance from (x_0,y_0) to the line is again given by projecting r onto v, giving

 d=|v^^·r|=(|(x_2-x_1)(y_1-y_0)-(x_1-x_0)(y_2-y_1)|)/(sqrt((x_2-x_1)^2+(y_2-y_1)^2)).


2. 점과 선의 거리 (3D)


PointLineDistance3D

Let a line in three dimensions be specified by two points x_1=(x_1,y_1,z_1) and x_2=(x_2,y_2,z_2) lying on it, so a vector along the line is given by

 v=[x_1+(x_2-x_1)t; y_1+(y_2-y_1)t; z_1+(z_2-z_1)t].
(1)

The squared distance between a point on the line with parameter t and a point x_0=(x_0,y_0,z_0) is therefore

 d^2=[(x_1-x_0)+(x_2-x_1)t]^2+[(y_1-y_0)+(y_2-y_1)t]^2+[(z_1-z_0)+(z_2-z_1)t]^2.
(2)

To minimize the distance, set d(d^2)/dt=0 and solve for t to obtain

 t=-((x_1-x_0)·(x_2-x_1))/(|x_2-x_1|^2),
(3)

where · denotes the dot product. The minimum distance can then be found by plugging t back into (2) to obtain

d^2=(x_1-x_0)^2+(y_1-y_0)^2+(z_1-z_0)^2+2t[(x_2-x_1)(x_1-x_0)+(y_2-y_1)(y_1-y_0)+(z_2-z_1)(z_1-z_0)]+t^2[(x_2-x_1)^2+(y_2-y_1)^2+(z_2-z_1)^2]
(4)
=|x_1-x_0|^2-2([(x_1-x_0)·(x_2-x_1)]^2)/(|x_2-x_1|^2)+([(x_1-x_0)·(x_2-x_1)]^2)/(|x_2-x_1|^2)
(5)
=(|x_1-x_0|^2|x_2-x_1|^2-[(x_1-x_0)·(x_2-x_1)]^2)/(|x_2-x_1|^2).
(6)

Using the vector quadruple product

 (AxB)^2=A^2B^2-(A·B)^2
(7)

where x denotes the cross product then gives

 d^2=(|(x_2-x_1)x(x_1-x_0)|^2)/(|x_2-x_1|^2),
(8)

and taking the square root results in the beautiful formula

d = (|(x_2-x_1)x(x_1-x_0)|)/(|x_2-x_1|)
(9)
= (|(x_0-x_1)x(x_0-x_2)|)/(|x_2-x_1|)
(10)
.
(11)

Here, the numerator is simply twice the area of the triangle formed by points x_0, x_1, and x_2, and the denominator is the length of one of the bases of the triangle, which follows since, from the usual triangle area formula, Delta=bd/2.

CITE THIS AS:

Weisstein, Eric W. "Point-Line Distance--3-Dimensional." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html


3. 선과 선의 거리 (당연하지만 3D)

http://mathworld.wolfram.com/Line-LineDistance.html

Line-Line Distance

The distance between two skew lines with equations

x = x_1+(x_2-x_1)s
(1)
x = x_3+(x_4-x_3)t
(2)

is given by

 D=(|(x_3-x_1)·[(x_2-x_1)x(x_4-x_3)]|)/(|(x_2-x_1)x(x_4-x_3)|)
(3)

(Gellert et al. 1989, p. 538). This can be written in the concise form

 D=(|c·(axb)|)/(|axb|)
(4)

by defining

a = x_2-x_1
(5)
b = x_4-x_3
(6)
c = x_3-x_1.
(7)

SEE ALSO: Skew Lines, Line-Line Angle, Line-Line Intersection

REFERENCES:

Gellert, W.; Gottwald, S.; Hellwich, M.; Kästner, H.; and Künstner, H. (Eds.). VNR Concise Encyclopedia of Mathematics, 2nd ed. New York: Van Nostrand Reinhold, 1989.

Hill, F. S. Jr. "The Pleasures of 'Perp Dot' Products." Ch. II.5 in Graphics Gems IV (Ed. P. S. Heckbert). San Diego: Academic Press, pp. 138-148, 1994.




CITE THIS AS:

Weisstein, Eric W. "Line-Line Distance." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/Line-LineDistance.html



[2011.10.26 즈음에 한 짓]

두 선 사이의 거리가 최소가 되는 점 X를 찾자.

syms x y z a1 b1 c1 a2 b2 c2 a3 b3 c3 a4 b4 c4;
X = [x y z];
X1 = [a1 b1 c1];
X2 = [a2 b2 c2];
X3 = [a3 b3 c3];
X4 = [a4 b4 c4];
d12 = sum((cross(X2-X1,X1-X)).^2)/sum((X2-X1).^2);
d34 = sum((cross(X4-X3,X3-X)).^2)/sum((X4-X3).^2);
d = d12 + d34;
dx = diff(d,x);
dy = diff(d,y);
dz = diff(d,z);

[x,y,z] = solve(dx,dy,dz, x,y,z)


 

The Fundamental Matrix Song

학술 2010. 10. 20. 15:38 Posted by 양고



Accurate Real-time Tracking using Mutual Information

학술 2010. 10. 19. 19:19 Posted by 양고
ISMAR 2010
Amaury Dame and Eric Marchand, IRISA

 

ü  Mutual information (MI, 상호정보) 은 신호 사이에 공유되는 정보의 양을 측정하는 것으로서 의료 영상에서 주로 사용된다. 조명 변화에 강인한 특성에도 불구하고 최적화 적용에 문제가 있어서 객체 추적에는 적용된 예가 드물었다. 그림에서 명확하게 나타난 피크가 보여주듯이 MI는 다른 방법에 비해 정확한 정합 측정 결과를 제공한다.


ü    본 논문은 MI 목적함수에 부합하는 최적화 방법을 새롭게 제안하였는데, Hessian 행렬을 개선하고 특정여 다른 방법에 비해 강인한 추적 결과를 얻었다. 미분 계산을 빠르게 하기 위한 방법도 제안되었다.

ü    제안된 MI 방법은 ESM (Efficient Second-order Minimisation) 방법과 비교하여 수렴성과 계산량 모두 우수함을 보였다.

 

 

 


ISMAR 2010
Computer Aided Medical Procedures & Augmented Reality (CAMP), Technische Universitat Munchen, Munich, Germany

내용 겉핥기
disparity가 클 경우 double vision으로 인해 visual discomfort가 발생한다. - 이 가정이 좀 그렇다. 3D를 시청하면서 double vision을 경험한 경우가 있었던가?
어쨌든 out-of-focus blur를 적용함으로써 double vision이 발생하지 않는 'fusional limit'를 증가시킬 수 있다.
모니터와 HMD 환경에서 각각 실험.
18명의 대상에 대해 실험한 결과 blur를 적용했을 경우 확연히 시청 품질이 높았다.
그러나 double vision 자체를 경험하지 못했다는 응답자들이 많아 원래의 가정이 맞는지 확언할 수는 없다.
실사 이미지의 경우 blur의 효과는 명확하지 않았다.
실시 이미지는 depth map을 실시간으로 추출하고 전경과 배경을 분리하여 blur를 적용하였다.


levmar (http://www.ics.forth.gr/~lourakis/levmar/) 제작자인 Manolis Lourakis (누나키스? ㅎㅎ) 사마에게 M-estimator 구현에 관해 질문했더니 다음과 같이 답변이 왔다.

안녕하세요,

귀하의 설명에 따라, 그것은 당신이 levmar에 나 - estimators을 통합하는 방법의 주요 아이디어를 파악해야 것 같습니다.

당신은 강력한 비용 함수를 사용하는 경우, 당신은 또한 그에 따라 Jacobian을 수정해야했지만합니다. 하는 것을 방지하려면 어떻게 그 levmar의 유한 차이 버전 (dlevmar_dif () 등)를 사용해보십시오. 메모리 오류에 관해서라면, 내가 도울 수없는 것 같은데, 당신은 당신의 코드에 가깝게 보일 것입니다.

사실 난 이미 levmar에 참석차 - estimators를 구현을 말하자면, 그들은 다음 릴리스에 포함됩니다 그런 것입니다
밖에서 한번 연말 전에 ... 불행히도 내가 더에 관한 정확한하실 수 없습니다했을 때 정확히.

최고, 안부

ML

추신 : 여러분의 영어 실력에 대해 걱정하지 마세요, 괜찮아요 ;-)에요

사실 답변이 큰 도움은 되지 않았지만 내가 하고 있는 방향이 맞다는 확신을 주었고,
levmar 차기버전을 기다리지 않고도 몇 가지 수정을 통해 M-estimator를 구현할 수 있었다. 고마워요 누나키스 사마~!

glReadPixels performance

학술 2010. 9. 17. 10:08 Posted by 양고
의외로 1ms 내외의 대선전.
믿어도 될까? -.-


해당 코드
 int j = 0;
 LARGE_INTEGER freq, t[20];
 QueryPerformanceFrequency(&freq);
 QueryPerformanceCounter(&t[j++]);
 glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, iM->imageData);
 QueryPerformanceCounter(&t[j++]);
 printf("readpixels: %g ms\n", (t[j-1].QuadPart - t[j-2].QuadPart)*1000./freq.QuadPart);


levmar 삽질극

학술 2010. 9. 13. 20:12 Posted by 양고
M-estimator 사용을 위해 levmar 콜백함수를 좀 손봤는데, 희한한 증상이 생겨났다.
처음 몇 줄 (Jacobian을 만드는) 은 제대로 돌아가지만, 그 다음부터 최소 gradient 방향으로 진행을 안 하더란 것.


사실 이것만이었더라면 오늘 오후를 몽땅 이걸 디버깅하는데 써버리진 않았겠지만...
저 똑같은 값만 반복하다가 멈추는 것이 불규칙하더라는 거다.
box constraint를 사용할 때와 안 할 때가 또 다르고...
또 central difference를 사용할 경우 heap corruption이 뜨고...!

M-estimator 도입을 위해 변경했던 부분을 모두 원복해가는 과정에서 문제를 발견했다.
levmar 콜백함수에서 levmar parameter p에서 r, t vector로 복사해주는 부분이 있다.
이를 단순 memcpy해서 쓰다가 서브루틴을 따로 만들었는데 이로부터 문제가 생겼던 것이다.

void Eval(float* p_eval, float* hx, int params, int measurements, void* data)
{
    // memcpy(mRVec.data.fl, p_eval, sizeof(float)*3);
    // memcpy(mTVec.data.fl, p_eval + 3, sizeof(float)*3);
    Phi2Vec(p_eval, &mTempRVec, &mTempTVec);
    ...
}

void Phi2Vec(float* param, CvMat* RVec, CvMat* TVec)
{
    for(int i = 0; i < 6; i++)
    {
        if(i < 3)
          RVec->data.fl[i] = phi[i]*scale[i];    // wrong
        else
          TVec->data.fl[i-3] = phi[i]*scale[i];    // wrong
    }
}

지금 보니 금방 눈에 들어온다만... Phi2Vec 함수의 인수는 param인데 함수 안에서 사용한 건 phi이다. param으로 고쳐야 맞다.
Phi2Vec 함수 이름 자체가 잘못 됐네. Param2Vec이 맞겠다.

이로써 알게 된 사실이 있는데, levmar에서는 처음 Jacobian을 만들 때는 levmar 함수에 주어진 파라미터 p를 직접 변경한다. 따라서 위 그림에서도 Jacobian을 구하는 것은 문제가 없었다.
그러나 그 다음부터 Jacobian 방향으로 실제 minimization을 진행하게 되면 내부적으로 임시 변수를 사용하는 것 같다. Jacobian을 만들 때부터 임시변수만 사용했더라면 처음부터 계속 고정값이었을거고 그럼 내가 p_eval이 아닌 다른 걸 쓰고있다는 사실을 쉽게 깨달았을테지...

결론적으로, levmar에서 콜백함수는 그야말로 버그의 온상이니 주의하자!
결론2는, 전역변수 남용을 자제하자!
결론3은, levmar 자체는 (대체로) 버그 프리하다. 신뢰하고 쓰자.

ㅠㅠ

Markerless Visual Tracking for Augmented Books

학술 2010. 8. 19. 17:21 Posted by 양고

아직 unpublished인 듯. 따라서 이 포스트도 비공개로 유지.
조규성 외.

인식
FAST 코너 추출 + Generic Randomized Forest (GRF)

추적
2단계 coarse to fine tracking using zero-mean SSD.
Drummond의 Lie Group 기반 motion model을 사용.
Tuckey M-estimator 사용. 즉 Gauss-Newton이나 유사 최적화를 사용하는 듯.

소감
Wagner의 approach와 유사함.
GRF를 이용한 페이지 인식의 빠른 속도(<40ms)에 감동.
tracking도 대체로 >60fps
요즘 논문보기를 소홀히 하여, 읽은 논문조차 올리지 않았는데 이로 인해 학술 능력이 나날이 저하되는 것 같아 이를 통탄하며 새로이 포스트를 올린다.

2000 IS(M)AR
Simon, Fitzgibbon and Zisserman (Oxford)

개요
scene의 planar structures를 사용자가 클릭해 주고 (plane의 aspect ratio s만 unknown), 나머지는 Zhang의 그것을 그대로 답습하고 있다. 저자들의 명성에 비하면 좀 실망.
알고리듬 개요:
1. image0에서 planar region을 수동 지정.
2. interest point 추출 (Harris, Moravec)
3. 4점에서 vanishing points 2개(v,w)로부터 K 검출. 여기까지가 초기화.
4. 이제부터 추적 단계. compute H from i to i+1
5. compute pose from homography chaining
6. compute K. (3에서처럼)

이 외에 한 plane에서 다른 plane으로의 "hand-off"나 incorporating off-plane tracks 등을 다루고 있음.