我正在从一个从移动传感器获取数据的项目中工作。我们已经在3d坐标中转换了传感器数据。其中一个传感器放在物体的手上 问题:当物体向后移动手然后向前移动时。所以我正在寻找物体指针向后移动的帧数。
为了解决这个问题,这种点可以来自3D这里的示例图像数据:
最初我使用y轴的变化来实现它。有一些阈值,结果是好的。但只有当物体指针向后移动并向前移动时,y轴的值才会减小。但是在理想情况下(图像),手可以以任何方式出现,即y值增加或y值减小。但我确信,当手向后移动时,它总是会增加(除了一些噪声帧或异常值)。使用这个我实现了这个。 `
std::pair<std::pair<int, int>, bool> calculateBacklift(std::vector<glm::vec3> points)
{
std::pair<std::pair<int, int>, bool> backlift;
backlift.second = false;
std::vector<glm::vec3> distanceVec;
for (int i = 0; i < points.size() - 1; ++i)
{
// vector
glm::vec3 distance;
distance.x = points[i + 1].x - points[i].x;
distance.y = points[i + 1].y - points[i].y;
distance.z = points[i + 1].z - points[i].z;
distanceVec.push_back(distance);
}
writeTodisk("distanceVector.csv", distanceVec);
for (int i = 0; i < distanceVec.size(); ++i)
{
// y is major axis and if any of x or z hand changed then i am assuming there can be direction change. this comes from experiment.
if (distanceVec[i].y <= -0.09 && (distanceVec[i].x <= -0.1 || distanceVec[i].z >= 0.9))
{
backlift.first = std::make_pair(1, i + 1);
backlift.second = true;
break;
}
}
return backlift;
}`
但是当手向上朝上时,它不起作用。因为y轴的变化是正的。
然后我想到使用点积找到方向的变化。和cos值。但它也检测轴(X,Z)上的方向变化。或者以简单的方式我可以说我想在y轴(主要)方向上移动传感器数据中找到角点。任何人都可以帮我解决这个问题。
感谢。
答案 0 :(得分:0)
假设你有entiry点轨迹,我只是寻找与连接起点和终点的线的距离最大的点。我不知道您正在使用的矢量库,但使用Eigen-library这将是这样的:
std::vector<Eigen::Vector3f> points; // input set of points
typedef Eigen::ParametrizedLine<float, 3> Line3;
// Calculate line through first and last point of points:
Line3 start_to_end = Line3::Through(points[0], points.back());
float max_dist_squared=0.0f;
size_t max_idx=0;
for(size_t i=0; i<points.size(); ++i) {
// calculate squared (perpendicular) distance from points[i] to the line
float dist2 = start_to_end.squaredDistance(points[i]);
// check if distance is bigger than previous maximum:
if(dist2 > max_dist_squared) { max_dist_squared = dist2; max_idx = i; }
}
您应该能够实现与您选择的库等效的东西。
如果您需要处理异常值或噪音,请使用某种移动中位数或移动平均值而不是单点。