【问题标题】:Calculating the angle between Points计算点之间的角度
【发布时间】:2020-09-08 15:17:39
【问题描述】:

使用 C++ 和 opencv

我正在尝试计算两点之间的角度.....我有一个 2D 平面,其边界框的中心点正在发生变化,现在如果第 1 帧中的中心点已更改其在第 2 帧中的位置,我需要求这两点的夹角。

这是我正在尝试做的示例:

有人可以提出解决这个问题的方法......吗?某种数学解决方案,或者可能是 C++ 函数。

【问题讨论】:

  • 两点之间没有角度,只有一条线。您需要两条线来定义一个角度。另一条线在哪里?
  • 是的,角度在哪里?也就是说,根据您的角度,atan2() 函数也可能有用,但您需要改进您的问题/图表以获得明确的答案。
  • 事实上,如果你能在图像上画出角度会很有用。

标签: c++ opencv


【解决方案1】:

使用Dot product:

v1.v2 = v1.x * v2.x + v1.y * v2.y

v1.v2 = |v1| * |v2| * cos(theta)
---------------------------------+
                                 |
                                 +-->  theta = acos(v1.v2 / |v1|*|v2|)

示例代码是:

float angleBetween(const Point &v1, const Point &v2)
{
    float len1 = sqrt(v1.x * v1.x + v1.y * v1.y);
    float len2 = sqrt(v2.x * v2.x + v2.y * v2.y);

    float dot = v1.x * v2.x + v1.y * v2.y;

    float a = dot / (len1 * len2);

    if (a >= 1.0)
        return 0.0;
    else if (a <= -1.0)
        return PI;
    else
        return acos(a); // 0..PI
}

它计算v1和v2之间的角度如下图

【讨论】:

  • 您是否愿意定义此处返回的角度?我们可以看看它是否符合@Tomazi 的要求
  • @David 他刚刚做了,所以我要删除我的评论:这里的图片胜过文字:)
  • 我在 youtube 上的 Dot Product youtube.com/watch?v=WDdR5s0C4cY,......and 上查找了一个视频,想知道为什么 a 和 b 都具有三个参数......现在在你的情况下 v 将是 Point 数据类型变量...... ?
  • @CroCo:它不计算点之间的角度。根据答案末尾的图片,计算两个入口点组成的两个向量之间的角度。
  • 感谢@deepmax 函数,我对其进行了一些修改以包含+/- 角度。只需返回方向 * acos(a);其中:浮动方向 = (v1.cross(v2) >= 0 ? 1.0 : -1.0);对于不完全理解如何使用这个函数的人:v1和v2是到中心点的相对位置,即v1 = p1 - pc,v2 = p2 - pc,其中pc是角度所在的中心点通过 pc 从 p1 到 p2 定义。
【解决方案2】:

假设您想计算两点之间相对于 2D 平面原点的角度,您可以使用点积来计算两点之间的角度(就像这个问题的另一个 answer 描述的那样)。

OpenCV 具有计算点积和点长度的实现。两点的点积为:

v1.dot(v2) // v1.x * v2.x + v1.y * v2.y

使用cv::norm的向量长度(通常称为向量的L2范数)为:

cv::norm(v1) // sqrt(v1.x * v1.x + v1.y * v1.y)

使用 OpenCV 的点积实现和向量的长度,我们有以下示例代码

double angle(const Point& v1, const Point& v2)
{
    double cosAngle = v1.dot(v2) / (cv::norm(v1) * cv::norm(v2));
    if (cosAngle > 1.0)
        return 0.0;
    else if (cosAngle < -1.0)
        return CV_PI;
    return std::acos(cosAngle);
}

此解决方案不仅限于二维点。它也可以用于计算3D点之间的角度。

注意,角度在Radians

如果你想要度数,你应该乘以 180 / Pi:

return std::acos(cosAngle) * 180 / CV_PI

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多