簡體   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