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이 되지 않는다
주의하자
glClear(GL_COLOR_BUFFER_BIT);
이렇게 하면 바탕 색이 적용된다.
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
이렇게 하면 바탕색이 적용되지 않는다.
생각하건데 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 이 되지 않는다.
이거 때문에 이틀을 날리고 그 다음에
두번째 실수이다 잊어버리지 말자
그래서 같은 클래스에 넣었었던 것으로 기억된다.