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이 되지 않는다

주의하자