简体   繁体   English

计算点之间的角度

[英]Calculating the angle between Points

Working with C++ and opencv使用 C++ 和 opencv

I am trying to calculate an angle between two points.....I have a 2D plane with a changing center point of a bounding box, Now if the center point in frame 1 has changed its location in frame 2 i need to find the angle of these two points.我正在尝试计算两点之间的角度.....我有一个 2D 平面,边界框的中心点不断变化,现在如果第 1 帧中的中心点已更改其在第 2 帧中的位置,我需要找到这两点的角度。

Here is the example of what i am trying to do:这是我正在尝试做的示例:

在此处输入图片说明

Can someone suggest a way of working this out.......?有人可以建议一种方法来解决这个问题......? some kind of mathematical solution or perhaps a C++ function.某种数学解决方案或 C++ 函数。

Use Dot product :使用点积

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

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

A sample code is:示例代码是:

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
}

It calculates angle between v1 and v2 as below image它计算 v1 和 v2 之间的角度,如下图所示

在此处输入图片说明

Assuming you want to calculate the angle between the two points relative to the origin of the 2D plane, you can use the dot product to calculate the angle between the points (like how the other answer of this question described).假设您要计算相对于 2D 平面原点的两点之间的角度,您可以使用点积来计算点之间的角度(就像这个问题的另一个答案所描述的那样)。

OpenCV has implementations of calculating the dot product and the length of points. OpenCV 有计算点积和点长度的实现。 The dot product of two points is:两点的点积为:

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

Length of vector (commonly referred as the L2 Norm of vector) using cv::norm is:使用cv::norm的向量长度(通常称为向量的 L2 范cv::norm为:

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

Using OpenCV's implementations of dot product and the length of vector we have the following sample code使用 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);
}

This solution isn't only limited to 2D points.此解决方案不仅限于 2D 点。 It can be used for calculating the angle between 3D points as well.它也可用于计算 3D 点之间的角度。

Note that angle is in Radians .请注意,角度以弧度为单位

If you want degrees, you should multiply it by 180 / Pi:如果你想要度数,你应该乘以 180 / Pi:

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

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

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