繁体   English   中英

计算点之间的角度

[英]Calculating the angle between Points

使用 C++ 和 opencv

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

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

在此处输入图片说明

有人可以建议一种方法来解决这个问题......? 某种数学解决方案或 C++ 函数。

使用点积

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 之间的角度,如下图所示

在此处输入图片说明

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

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

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

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

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);
}

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

请注意,角度以弧度为单位

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM