OpenCV系列 --- 直线拟合

作者: 307656af5a04 | 来源:发表于2019-04-19 14:38 被阅读39次

一、FitLine()函数原型

CV_EXPORTS_W void fitLine( 
    // 待输入点集(一般为二维数组或vector点集)
  InputArray points,    
    // 输出点集(一个是方向向量,
    //另一个是拟合直线上的点)
    //(Vec4f(2d)或Vec6f(3d)的vector)
  OutputArray line,   
  int distType,         // 距离类型
  double param,         // 距离参数
  double reps,       // 径向的精度参数
  double aeps );       // 角度精度参数 

第一个参数是用于拟合直线的输入点集,可以是二维点的cv::Mat数组,也可以是二维点的STL vector。

第二个参数是输出的直线,对于二维直线而言类型为cv::Vec4f,对于三维直线类型则是cv::Vec6f,输出参数的前半部分给出的是直线的方向,而后半部分给出的是直线上的一点(即通常所说的点斜式直线)。

第三个参数是距离类型,拟合直线时,要使输入点到拟合直线的距离和最小化(即下面公式中的cost最小化),可供选的距离类型如下表所示,ri表示的是输入的点到直线的距离。

CV_DIST_USER =-1, /* User defined distance */
CV_DIST_L1 =1, /* distance = |x1-x2| + |y1-y2| */
CV_DIST_L2 =2, /* the simple euclidean distance */
CV_DIST_C =3, /* distance = max(|x1-x2|,|y1-y2|) */
CV_DIST_L12 =4, /* L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1)) */
CV_DIST_FAIR =5, /* distance = c^2(|x|/c-log(1+|x|/c)), c = 1.3998 */
CV_DIST_WELSCH =6, /* distance = c^2/2(1-exp(-(x/c)^2)), c = 2.9846 */
CV_DIST_HUBER =7 /* distance = |x|<c ? x^2/2 : c(|x|-c/2), c=1.345 */

第四个参数是距离参数,跟所选的距离类型有关,值可以设置为0,cv::fitLine()函数本身会自动选择最优化的值

第五、六两个参数用于表示拟合直线所需要的径向和角度精度,通常情况下两个值均被设定为1e-2。

下面,从一个具体的例子来看cv::Line()实际拟合的效果。

#include <opencv2/opencv.cpp>
#include <vector>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
    //创建一个用于绘制图像的空白图
    cv::Mat image = cv::Mat::zeros(480, 640, CV_8UC3);
 
    //输入拟合点
    std::vector<cv::Point> points;
    points.push_back(cv::Point(48, 58));
    points.push_back(cv::Point(105, 98));
    points.push_back(cv::Point(155, 160));
    points.push_back(cv::Point(212, 220));
    points.push_back(cv::Point(248, 260));
    points.push_back(cv::Point(320, 300));
    points.push_back(cv::Point(350, 360));
    points.push_back(cv::Point(412, 400));
 
    //将拟合点绘制到空白图上
    for (int i = 0; i < points.size(); i++)
    {
        cv::circle(image, points[i], 
              5, cv::Scalar(0, 0, 255), 2, 8, 0);
    }
 
    cv::Vec4f line_para; 
    cv::fitLine(points, line_para, 
          cv::DIST_L2, 0, 1e-2, 1e-2);
 
    std::cout << "line_para = " 
          << line_para << std::endl;
 
    //获取点斜式的点和斜率
    cv::Point point0;
    point0.x = line_para[2];
    point0.y = line_para[3];
 
    double k = line_para[1] / line_para[0];
 
    //计算直线的端点(y = k(x - x0) + y0)
    cv::Point point1, point2;
    point1.x = 0;
    point1.y = k * (0 - point0.x) + point0.y;
    point2.x = 640;
    point2.y = k * (640 - point0.x) + point0.y;
 
    cv::line(image, point1, point2, 
            cv::Scalar(0, 255, 0), 2, 8, 0);
 
    cv::imshow("image", image);
    cv::waitKey(0);

    return 0;
}

好了,今天OpenCV学到这里就结束了,喜欢的朋友可以给我点个赞哦!!!

相关文章

  • OpenCV系列 --- 直线拟合

    一、FitLine()函数原型 第一个参数是用于拟合直线的输入点集,可以是二维点的cv::Mat数组,也可以是二维...

  • 直线拟合

    bool lineFit(const std::vector &points, double &a, double...

  • Logistic回归

    用一条直线对一些数据点进行拟合(该线称为最佳拟合直线),这个拟合过程就成为回归。 利用Logistic回归进行分类...

  • 逻辑回归

    概念 假设现在有一些数据点,我们用一条直线(最佳拟合直线)进行拟合,这个拟合的过程就称作回归。 利用Logisti...

  • Logistic回归

    Logistic回归 假设有一些数据点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程称作回...

  • 直线拟合公式

  • Python Logistic回归分类

    1.Logistic回归 人们将已知存在的数据点利用一条直线进行拟合(该直线被称为最佳拟合直线)的过程称为回归。而...

  • Logistic回归

    机器学习实战 假设现在有一些数据点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作回归...

  • iOS中使用OpenCV进行线性拟合(直线and曲线)

    先上Github地址 线性拟合的应用领域比较广泛, 如运动轨迹计算、数据分析、图像处理等领域, 故在此写一篇学习...

  • 数据科学(机器学习: Logistic回归算法)

    回归算法的一种,假设现在有一些数据点,我们利用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作...

网友评论

    本文标题:OpenCV系列 --- 直线拟合

    本文链接:https://www.haomeiwen.com/subject/dmiowqtx.html