bool LeastSquaresVelocityTrackerStrategy::GetEstimator( uint32_t id, Estimator* out_estimator) const { out_estimator->Clear(); // Iterate over movement samples in reverse time order and collect samples. float x[kHistorySize]; float y[kHistorySize]; float w[kHistorySize]; float time[kHistorySize]; uint32_t m = 0; uint32_t index = index_; const base::TimeDelta horizon = base::TimeDelta::FromMilliseconds(kHorizonMS); const Movement& newest_movement = movements_[index_]; do { const Movement& movement = movements_[index]; if (!movement.id_bits.has_bit(id)) break; TimeDelta age = newest_movement.event_time - movement.event_time; if (age > horizon) break; const PointerXY& position = movement.GetPointerXY(id); x[m] = position.x; y[m] = position.y; w[m] = ChooseWeight(index); time[m] = -static_cast<float>(age.InSecondsF()); index = (index == 0 ? kHistorySize : index) - 1; } while (++m < kHistorySize); if (m == 0) return false; // no data // Calculate a least squares polynomial fit. uint32_t degree = degree_; if (degree > m - 1) degree = m - 1; if (degree >= 1) { float xdet, ydet; uint32_t n = degree + 1; if (SolveLeastSquares(time, x, w, m, n, out_estimator->xcoeff, &xdet) && SolveLeastSquares(time, y, w, m, n, out_estimator->ycoeff, &ydet)) { out_estimator->time = newest_movement.event_time; out_estimator->degree = degree; out_estimator->confidence = xdet * ydet; return true; } } // No velocity data available for this pointer, but we do have its current // position. out_estimator->xcoeff[0] = x[0]; out_estimator->ycoeff[0] = y[0]; out_estimator->time = newest_movement.event_time; out_estimator->degree = 0; out_estimator->confidence = 1; return true; }
int EvaluateMain(int argc, char* argv[]) { int fId = atoi(argv[1]); CStr wkDir = argv[2]; CStr imgFolder = argv[3]; CStr rstFolder = argv[4]; CStr methodNam = argv[5]; vecS des; des.push_back(methodNam); if (argc == 7) { int nr = atoi(argv[6]); vecS rstDirs; for (int i = 0; i < nr; i++) { char outFile[50]; sprintf_s(outFile, "%s%d", rstFolder.c_str(), i); rstDirs.push_back(std::string(outFile)); } CmEvaluation::EvalueMaskProposals(wkDir, imgFolder, rstDirs, des, wkDir + "\\Results.m"); } else { switch (fId) { case 0: CmEvaluation::EvalueMask(wkDir + imgFolder + "\\*.png", wkDir + "\\" + rstFolder + "\\", des, wkDir + "\\Results.m"); break; case 1: CmEvaluation::DebugEvalueMask(wkDir, imgFolder, rstFolder, des, wkDir + "CutRes.m"); break; case 2: CmEvaluation::EvalueMaskProposals(wkDir, imgFolder, rstFolder, des, wkDir + "CutRes.m"); break; case 3: ChooseWeight(); break; default: break; } } //des.push_back("HC"); //des.push_back("RC"); //des.push_back("SF"); des.push_back("SalPIF"); //CmEvaluation::EvalueMask(wkDir + imgFolder + "\\*.png", wkDir + "\\" + rstFolder+"\\", des, wkDir + "\\Results.m"); //CmEvaluation::EvalueMaskProposals(wkDir, imgFolder, rstFolder, des, wkDir + "CutRes.m"); //CmEvaluation::DebugEvalueMask(wkDir, imgFolder, rstFolder, des, wkDir + "CutRes.m"); return 1; }