2009. 3. 6. 14:29

tracking을 먼저 한 다음에 점을 추가해야

tracking이 제대로 된다

 if(add_point) 를 한 다음에

if(ptnum > 0)

를 실행하면 new2D 에 0.413 등의 소수점으로 바뀌어서

계속 tracking이 되지 않는다

주의하자

이유를 알 거 같다...;;;

Old Point 가 있어야 Tracking 이 되기 때문에...

한번 쉬어야 한다....;;;


그걸 몰랐네...;; 그걸 몰랐어...;;
2009. 3. 6. 12:18

x1 = P1 * X1
x2 =  P2 * X2

여기에서  P1 = [R1 | t1]; 이다. R1은 SO(3)에 포함되고 t1은 3D vector 이다.

1. Reconstruction Method

P1(t) = p1 + t * v1;
P2(s) = p2 + s * v2;

다음과 같이 되기 때문에 P1 과 P2 가 같게 되는 t와 s를 각각 구하면 된다.

두 장의 영상에서 임의의 점에 대한 대응점을 x와 x'이라고 하면
다음과 같이 만들 수 있다.
(x와 x'은 영상 좌표의 homogeneous coordinate 이다)
xn = K-1 * x;
xn' = K-1 * x';
p1 = - R1' * t1;
p2 = - R2' * t2;
v1 = R1' * xn;
v2 = R2' * xn';

위의 4개의 vector p1, p2, v1, v2를 이용하여
다음과 같은 식으로 t와 s를 구할 수 있다.

k1 = p2 - p1;
k2 = v1 x v2;
M1 = [k1 v2 k2];
M2 = [k1 v1 k2];
t = det(M1) / (k2' * k2);
s = det(M2) / (k2' * k2);

t와 s를 구하면 P1(t) 와 P2(s) 에 각각 대입하면

같은 3D 좌표가 나오게 되고 이게

실제 3차원 상의 점이 된다.


2008. 9. 4. 21:03

if(ptnum > 0)
 {
  cvCalcOpticalFlowPyrLK(prev_gray, gray, prev_pyramid, pyramid,
                 m2DOld, m2DNew, ptnum, cvSize(win_size, win_size),
        3, status, 0,
        cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 20, 0.03), flags);
   flags |= CV_LKFLOW_PYR_A_READY;

   int k = 0;
   for(int i = 0; i < ptnum; ++i)
   {
    if( !status[i] )
               continue;

    m2DNew[k++] = m2DNew[i];
   }
   ptnum = k;
 }

 if(add_point)
 {
  m2DNew[ptnum].x = (float)pt.x;
  m2DNew[ptnum].y = (float)pt.y;
 
  add_point = false;
  cvFindCornerSubPix( gray, m2DNew, ptnum,
                cvSize(win_size,win_size), cvSize(-1,-1),
                cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03));
  ++ptnum;
 }

tracking을 먼저 한 다음에 점을 추가해야

tracking이 제대로 된다

 if(add_point) 를 한 다음에

if(ptnum > 0)

를 실행하면 new2D 에 0.413 등의 소수점으로 바뀌어서

계속 tracking이 되지 않는다

주의하자

2008. 9. 1. 15:38
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

이렇게 하면 바탕 색이 적용된다.

glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);

이렇게 하면 바탕색이 적용되지 않는다.
2008. 8. 19. 04:39

생각하건데 OpenCV 모든 함수에서도 그렇겠지만

함수의 인자에서 포인터를 넣으면 안 된다

예를 들어서


class CDataSet
{
protected:
 CvPoint2D32f * m2DNew;
 CvPoint2D32f * m2DOld;

public:
CvPoint2D32f * GetNew() { return m2DNew; }
 CvPoint2D32f * GetOld() { return m2DOld; }
};

이라고 했을 때

cvCalcOpticalFlowPyrLK(prev_gray, gray, prev_pyramid, pyramid,
                     OldPt, NewPt, *n,
         cvSize(win_size, win_size), 3, status, 0,
         cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 20, 0.03), flags);

이렇게 했을 때

Point Tracking 이 되지 않는다.

이거 때문에 이틀을 날리고 그 다음에

두번째 실수이다 잊어버리지 말자

그래서 같은 클래스에 넣었었던 것으로 기억된다.