计算点之间的角度 使用C++和OpenCV

计算点之间的角度 使用C++和OpenCV ,c++,opencv,C++,Opencv,我试图计算两点之间的角度……我有一个二维平面,边界框的中心点在变化,现在如果第1帧中的中心点在第2帧中的位置发生变化,我需要找到这两点的角度 下面是我正在尝试做的示例: 有人能提出解决这个问题的办法吗。。。。。。。?某种数学解法,或者是C++函数。:使用< /P> 示例代码是: float angleBetween(const Point &v1, const Point &v2) { float len1 = sqrt(v1.x * v1.x + v1.y * v1.

我试图计算两点之间的角度……我有一个二维平面,边界框的中心点在变化,现在如果第1帧中的中心点在第2帧中的位置发生变化,我需要找到这两点的角度

下面是我正在尝试做的示例:

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

:使用< /P> 示例代码是:

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
}
float angleBetween(常数点和v1、常数点和v2)
{
float len1=sqrt(v1.x*v1.x+v1.y*v1.y);
浮点len2=sqrt(v2.x*v2.x+v2.y*v2.y);
浮点数=v1.x*v2.x+v1.y*v2.y;
浮点a=点/(len1*len2);
如果(a>=1.0)
返回0.0;

否则,如果(a假设要计算两点之间相对于二维平面原点的角度,可以使用点积计算点之间的角度(如本问题的另一个描述)

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

v1.dot(v2) // v1.x * v2.x + v1.y * v2.y
使用is的向量长度(通常称为向量的L2范数):

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

两点之间没有角度,只有一条线。需要两条线来定义角度。另一条线在哪里?是的,角度在哪里?也就是说,根据角度的位置,atan2()函数可能也很有用,但您需要改进您的问题/图表以获得明确的答案。事实上,如果您可以在图像上绘制角度,它将非常有用。您是否愿意定义此处返回的角度?我们可以查看它是否符合@Tomazi@David他刚刚这么做了,所以我删除了我的评论:一张照片上写着莫尔(这里的单词是:)我在youtube的Dot Product上查看了一段视频,想知道为什么a和b都有三个参数……现在在你的例子中,v将是点数据类型变量……@CroCo:它不计算点之间的角度。根据答案末尾的图片,它是计算由两个入口点组成的两个向量之间的角度。谢谢你的函数@deepmax,我对它做了一些修改,包括+/-角度。只需返回方向*acos(a);其中:浮点方向=(v1.cross(v2)>=0?1.0:-1.0);对于那些不完全了解如何使用此功能的人:v1和v2是从中心点开始的相对位置,即v1=p1-pc,v2=p2-pc,其中pc是从p1到p2通过pc定义角度的中心点。
cv::norm(v1) // sqrt(v1.x * v1.x + v1.y * v1.y)
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);
}
return std::acos(cosAngle) * 180 / CV_PI