cv :: fitLine无法将线拟合到水平点

时间:2019-07-18 14:56:41

标签: c++ opencv

当试图将一条直线拟合到一组几乎水平的点时,似乎OpenCV的fitLine无法检测到正确的直线参数,而是返回了错误的向量:

#include <vector>
#include <iostream>
#include <opencv2/imgproc.hpp>

int main()
{
    std::vector<cv::Point> points = { 
        {432,654},
        {370,656},
        {390,656},
        {410,656},
        {348,658},
        // Note that the above points are almost perfectly 
        // aligned along the y=656 line
    };

    cv::Vec4f lineParam;
    cv::fitLine(points, lineParam, cv::DIST_L1, 0, 0.01, 0.01);
    std::cout << lineParam << std::endl;
}

在我的PC(Windows 10,VS2017,OpenCV 3.4.3)上运行上述代码段:

[0.701592, -0.712579, 390, 656]

前两个值(vxvy)是线的方向矢量,应为(1,0)(-1,0)。返回的矢量用于角度约为-45°的对角线。硬编码参数的值取自fitLine's documentation。 我是否缺少明显的东西,或者这是OpenCV错误?我在Google,OpenCV的GitHub问题跟踪器或论坛上找不到任何相关内容。


更新:

如果我对距离函数使用cv::DIST_L2而不是cv::DIST_L1,则可以正确估算直线:

[0.999247, -0.038801, 390, 656]

然后看来,该问题与使用L1距离有关。

0 个答案:

没有答案