使用 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
向量的长度(通常称为向量的 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);
}
该解决方案不仅限于二维点。它也可用于计算 3D 点之间的角度。
请注意,角度以弧度为单位。
如果你想要度数,你应该乘以 180 / Pi:
return std::acos(cosAngle) * 180 / CV_PI