如何在Opencv中找到两条直线的点积

4
我正在开发一个需要找到两条直线之间夹角的程序。我已经找到了这些直线的所有点坐标,并参照0,0点进行了引用,但是我不知道如何在OpenCV中使用点积来查找夹角。
我使用的是Visual C++和OpenCV库。我还发现我可以使用cv::Mat::dot函数来获取点积,但是我找不到任何好的例子。我无法理解这个link中的解释。
有人能给我一个好的例子吗?这样我就可以理解如何使用该函数来找到两条直线的点积。谢谢。
2个回答

6
如果您有两个表示线的向量,分别称为ab(类型为cv::Mat),那么点积的计算方法如下:
double p = a.dot(b);

编辑 根据作者的注释,这是示例代码。

float a[2] = {1.0, 2.0};
float b[2] = {3.0, 4.0};

cv::Mat AA(1,2,CV_32FC1,a);
cv::Mat BB(1,2,CV_32FC1,b);

cout << AA << endl;
cout << BB << endl;
cout << AA.dot(BB) << " should be equal to 11" << endl;

好的,谢谢@kigurai。我已经尝试了,但是p的结果与我的经典计算a.b不同,其中a(x1,y1)和b(x2,y2),a.b = x1x2 + y1y2。我错过了什么? - anjaryes
这就是它应该工作的方式,没错。但是如果您不发布一些代码,很难知道哪里出了问题。您的向量a和b的大小是多少? - Hannes Ovrén
我的向量是:a(-92,-131),b(57,-173)。我使用以下代码创建了a和b的矩阵>> cv :: Mat AA = cv :: Mat(1,2,CV_32FC1,a); cv :: Mat BB = cv :: Mat(1,2,CV_32FC1,b)。然后我执行double p = AA.dot(BB)..有什么问题吗? - anjaryes
不确定您的ab向量是什么类型。我更新了我的答案,并提供了经过确认可行的示例代码。我假设a和b是浮点数数组。我猜想您的问题可能在于a和b的数据类型。 - Hannes Ovrén
谢谢@kigurai。我的问题非常简单,我没有定义数组变量的大小。现在,它运行得非常好。感谢您和您的优秀示例.. :D - anjaryes

-4

两个向量A和B的点积dot product定义为:

(A的长度) * (B的长度) * cos(夹角)

其中夹角表示两个向量之间的夹角。因此,要找到两者之间的夹角,首先必须找到点积,然后将其除以A和B的长度,最后取反余弦。

在您的情况下,假设a和b已适当声明为cv::Mat,则如下所示:

double dotprod = a.dot(b);
double angle = arccos(dotprod / (a.size().height * b.size().height))

谢谢@Commander,我尝试了你的语法,但是我的角度得到了NaN。那我错过了什么吗?谢谢 :) - anjaryes
2
a.size().height 不会是 a 的长度,b 也一样。 - Roger Rowland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接