OpenCV实现直线拟合

作者:我有一個夢想 时间:2023-06-22 15:22:37 

相比于直线检测,直线拟合的最大特点是将所有数据只拟合出一条直线

OpenCV实现直线拟合

void fitLine( InputArray points, OutputArray line, int distType,
                          double param, double reps, double aeps );
  • points:输入待拟合直线的2D或者3D点集。

  • line:输出描述直线的参数,2D点集描述参数为Vec4f类型,3D点集描述参数为Vec6f类型。

  • distType:M-estimator算法使用的距离类型标志,可以选择的距离类型在表7-1中给出。

  • param:某些类型距离的数值参数(C)。如果数值为0,则自动选择最佳值。

  • reps:坐标原点与直线之间的距离精度,数值0表示选择自适应参数,一般常选择0.01。

  • aeps:直线角度精度,数值0表示选择自适应参数,一般常选择0.01。

该函数利用最小二乘法拟合出距离所有点距离最小的直线,直线的描述形式可以转化成点斜式。函数第一个参数是待拟合直线的2D或者3D点集,可以存放在vector<>或者Mat类型的变量中赋值给参数。函数第二个参数是拟合直线的描述参数,如果是2D点集,输出量为Vec4f类型的(vx vy x0 y0),其中(vx vy)是与直线共线的归一化向量,(x0 y0)是拟合直线上的随意一点,根据这四个量可以计算得到2维平面直线的点斜式解析式,表示形式如式所示。

OpenCV实现直线拟合

如果输入参数是3D点集,输出量为Vec6f类型的(vx vy vz x0 y0 z0),其中(vx vy vz)是与直线共线的归一化向量,(x0 y0 z0)是拟合直线上的随意一点。函数第三个参数是M-estimator算法使用的距离类型标志,可以选择的距离类型在表中给出。函数第四个参数是某些距离类型中的数值参数C,如果数值0表示选择最佳值。函数第五个参数表示坐标原点与拟合直线之间的距离精度,数值0表示选择自适应参数;函数第六个参数表示拟合直线的角度精度,数值0表示选择自适应参数。第五个参数和第六个参数一般取值0.01。

OpenCV实现直线拟合

简单示例

//
// Created by smallflyfly on 2021/6/22.
//
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int main() {
   Vec4f lines;
   vector<Point2f> points;
   const static float pts[20][2] = {
           {0.0f,0.0f},{10.0f,11.0f},{21.0f,20.0f},{30.0f,30.0f},
           {40.0f,42.0f},{50.0f,50.0f},{60.0f,60.0f},{70.0f,70.0f},
           {80.0f,80.0f},{90.0f,92.0f},{100.0f,100.0f},{110.0f,110.0f},
           {120.f,120.0f},{136.0f,130.0f},{138.0f,140.0f},{150.0f,150.0f},
           {160.0f,163.0f},{175.0f,170.0f},{181.0f,180.0f},{200.0f,190.0f}
   };
   for (int i = 0; i < 20; ++i) {
       points.emplace_back(pts[i][0], pts[i][1]);
   }
   double param = 0.0;
   double reps = 0.01;
   double aeps = 0.01;
   fitLine(points, lines, DIST_L1, param, reps, aeps);
   cout << lines << endl;
return 0;
}

来源:https://blog.csdn.net/B08370108/article/details/118105855

标签:OpenCV,直线拟合
0
投稿

猜你喜欢

  • springBoot整合rabbitMQ的方法详解

    2022-08-19 02:28:33
  • Spring的Aware接口实现及执行顺序详解

    2023-03-09 09:50:53
  • java搜索无向图中两点之间所有路径的算法

    2023-11-10 09:28:26
  • 基于Springboot一个注解搞定数据字典的实践方案

    2022-12-23 01:12:38
  • Java扩展库RxJava的基本结构与适用场景小结

    2022-12-27 10:03:15
  • Java常用时间工具类总结(珍藏版)

    2022-04-23 18:38:31
  • java Spring的启动原理详解

    2022-09-02 04:39:59
  • Java 8 中 Map 骚操作之 merge() 的使用方法

    2022-03-31 01:19:27
  • C#条件拼接Expression<Func<T, bool>>的使用

    2023-07-11 22:29:18
  • Springboot Vue实现单点登陆功能示例详解

    2023-11-05 00:29:11
  • Flutter Future异步操作详细讲解

    2022-04-05 17:55:32
  • java中synchronized锁的升级过程

    2023-12-01 13:14:51
  • C#绘制饼状图和柱状图的方法

    2023-12-19 15:42:59
  • Spring Shell应用程序开发流程解析

    2021-06-28 23:20:50
  • C#判断访问来源是否为搜索引擎链接的方法

    2021-11-01 09:15:53
  • Android组合控件自定义标题栏

    2021-11-04 01:12:36
  • C#带你玩扫雷(附源码)

    2021-11-04 05:54:23
  • Android实现列表数据按名称排序、中英文混合排序

    2022-10-18 15:15:57
  • Android studio设计简易计算器

    2023-01-26 22:21:40
  • spring web.xml指定配置文件过程解析

    2023-05-15 01:32:40
  • asp之家 软件编程 m.aspxhome.com