【问题标题】:How to Find Dot Product of Two Lines (Opencv)如何找到两条线的点积(Opencv)
【发布时间】:2013-12-12 07:30:14
【问题描述】:

我正在开发一个程序,该程序需要我找到两条线之间的角度。我找到了线的所有点坐标,引用到 0,0 点,但我不明白如何在 Opencv 中实现点积来找到角度。

我通过 opencv 库使用 Visual C++。我还发现我可以使用 cv::Mat::dot 函数来获取点积,但我找不到任何好的例子。看不懂这个link的解释。

谁能给我一个很好的例子?所以我可以理解如何使用该函数来查找两行的点积。谢谢你。

【问题讨论】:

    标签: c++ opencv dot-product


    【解决方案1】:

    如果您有两个向量代表您的线条,并将它们称为 abcv::Mat 类型),则点积计算为

    double p = a.dot(b);
    

    编辑 示例代码,作者 cmets 提供。

    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;
    

    【讨论】:

    • ok,谢谢@kigurai。我试过了,但是p的结果和我对a.b的经典计算不同,其中a(x1,y1)和b(x2,y2),a.b = x1*x2 + y1*y2。我想念什么?
    • 它应该是这样工作的,是的。但是除非您发布一些代码,否则很难知道出了什么问题。你的向量 a 和 b 的大小是多少?
    • 我的向量是: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).. 有什么问题吗?
    • 不确定您的 ab 向量是什么类型。我用我确认有效的示例代码更新了我的答案。我假设 a 和 b 是浮点数组。我猜你的问题出在 a 和 b 的数据类型上。
    • 谢谢@kigurai。我的问题很简单,我没有定义数组变量的大小。现在,它运作良好。感谢你和你的好榜样.. :D
    【解决方案2】:

    嗯,两个向量A和B的dot product定义为

    (length of A) * (length of B) * cos(angle)

    其中angle 表示两个向量之间的角度。所以要求两者的夹角,首先要求点积,然后除以A的长度和B的长度,再取反余弦。

    假设 a 和 b 被适当地声明为 cv::Mats:

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

    【讨论】:

    • 感谢@Commander,我已经尝试过你的语法,但我得到了我的角度的 NaN。所以,我想念什么?谢谢:)
    • a.size().heightnot 将成为 a 的长度,b 的长度相同。
    猜你喜欢
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    相关资源
    最近更新 更多