private:
int _numberOfPoints;
std::vector<singleo::Point> _points;
+ float _distanceThresValue;
+ float distanceValue(std::tuple<float, float> pt1, std::tuple<float, float> pt2);
public:
PointsTracker(const int numbers);
virtual ~PointsTracker();
PointsTracker::PointsTracker(const int numbers) : AbstractTracker(numbers)
{
_numberOfPoints = numbers;
+ _distanceThresValue = sqrt(2.f);
}
PointsTracker::~PointsTracker()
}
+float PointsTracker::distanceValue(std::tuple<float, float> pt1, std::tuple<float, float> pt2)
+{
+ float diffX = get<0>(pt1) - get<0>(pt2);
+ float diffY = get<1>(pt1) - get<1>(pt2);
+
+ return sqrt(diffX * diffX + diffY * diffY);
+}
+
void PointsTracker::init(vector<Point> &points)
{
if (points.size() != _filters.size()) {
for (auto &point : _points) {
auto newPoint = _filters[index]->predict();
+ if (distanceValue({static_cast<float>(point.x), static_cast<float>(point.y)}, newPoint) <= _distanceThresValue) {
+ index++;
+ continue;
+ }
+
point.x = get<0>(newPoint);
point.y = get<1>(newPoint);
index++;
_filters[index]->update(point.x, point.y);
auto newPoint = _filters[index]->get();
- _points[index].x = static_cast<int>(get<0>(newPoint));
- _points[index].y = static_cast<int>(get<1>(newPoint));
+ if (distanceValue({static_cast<float>(point.x), static_cast<float>(point.y)}, newPoint) <= _distanceThresValue) {
+ _filters[index]->update(_points[index].x, _points[index].y);
+ } else {
+ _points[index].x = static_cast<int>(get<0>(newPoint));
+ _points[index].y = static_cast<int>(get<1>(newPoint));
+ }
index++;
}