void trackKlt( FramePtr frame_ref, FramePtr frame_cur, vector<cv::Point2f>& px_ref, vector<cv::Point2f>& px_cur, vector<Vector3d>& f_ref, vector<Vector3d>& f_cur, vector<double>& disparities) { const double klt_win_size = 30.0; const int klt_max_iter = 30; const double klt_eps = 0.001; vector<uchar> status; vector<float> error; vector<float> min_eig_vec; cv::TermCriteria termcrit(cv::TermCriteria::COUNT+cv::TermCriteria::EPS, klt_max_iter, klt_eps); cv::calcOpticalFlowPyrLK(frame_ref->img_pyr_[0], frame_cur->img_pyr_[0], px_ref, px_cur, status, error, cv::Size2i(klt_win_size, klt_win_size), 4, termcrit, cv::OPTFLOW_USE_INITIAL_FLOW); vector<cv::Point2f>::iterator px_ref_it = px_ref.begin(); vector<cv::Point2f>::iterator px_cur_it = px_cur.begin(); vector<Vector3d>::iterator f_ref_it = f_ref.begin(); f_cur.clear(); f_cur.reserve(px_cur.size()); disparities.clear(); disparities.reserve(px_cur.size()); for(size_t i=0; px_ref_it != px_ref.end(); ++i) { if(!status[i]) { px_ref_it = px_ref.erase(px_ref_it); px_cur_it = px_cur.erase(px_cur_it); f_ref_it = f_ref.erase(f_ref_it); continue; } f_cur.push_back(frame_cur->c2f(px_cur_it->x, px_cur_it->y)); disparities.push_back(Vector2d(px_ref_it->x - px_cur_it->x, px_ref_it->y - px_cur_it->y).norm()); ++px_ref_it; ++px_cur_it; ++f_ref_it; } }