当试图将一条直线拟合到一组几乎水平的点时,似乎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]
前两个值(vx
和vy
)是线的方向矢量,应为(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距离有关。