一、FitLine()函数原型

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

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

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

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

CV_DIST_USER =-, /* User defined distance */
CV_DIST_L1 =, /* distance = |x1-x2| + |y1-y2| */
CV_DIST_L2 =, /* the simple euclidean distance */
CV_DIST_C =, /* distance = max(|x1-x2|,|y1-y2|) */
CV_DIST_L12 =, /* L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1)) */
CV_DIST_FAIR =, /* distance = c^2(|x|/c-log(1+|x|/c)), c = 1.3998 */
CV_DIST_WELSCH =, /* distance = c^2/2(1-exp(-(x/c)^2)), c = 2.9846 */
CV_DIST_HUBER = /* 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(, , CV_8UC3); //输入拟合点
std::vector<cv::Point> points;
points.push_back(cv::Point(, ));
points.push_back(cv::Point(, ));
points.push_back(cv::Point(, ));
points.push_back(cv::Point(, ));
points.push_back(cv::Point(, ));
points.push_back(cv::Point(, ));
points.push_back(cv::Point(, ));
points.push_back(cv::Point(, )); //将拟合点绘制到空白图上
for (int i = ; i < points.size(); i++)
{
cv::circle(image, points[i], , cv::Scalar(, , ), , , );
} cv::Vec4f line_para;
cv::fitLine(points, line_para, cv::DIST_L2, , 1e-, 1e-); std::cout << "line_para = " << line_para << std::endl; //获取点斜式的点和斜率
cv::Point point0;
point0.x = line_para[];
point0.y = line_para[]; double k = line_para[] / line_para[]; //计算直线的端点(y = k(x - x0) + y0)
cv::Point point1, point2;
point1.x = ;
point1.y = k * ( - point0.x) + point0.y;
point2.x = ;
point2.y = k * ( - point0.x) + point0.y; cv::line(image, point1, point2, cv::Scalar(, , ), , , ); cv::imshow("image", image);
cv::waitKey(); return ;
}

参考链接:(1)https://blog.csdn.net/guduruyu/article/details/69505487

     (2)https://blog.csdn.net/qq_29540745/article/details/72779847

【OpenCV3】直线拟合--FitLine()函数详解的更多相关文章

  1. malloc 与 free函数详解<转载>

    malloc和free函数详解   本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...

  2. NSSearchPathForDirectoriesInDomains函数详解

    NSSearchPathForDirectoriesInDomains函数详解     #import "NSString+FilePath.h" @implementation ...

  3. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  4. Linux C popen()函数详解

    表头文件 #include<stdio.h> 定义函数 FILE * popen( const char * command,const char * type); 函数说明 popen( ...

  5. kzalloc 函数详解(转载)

    用kzalloc申请内存的时候, 效果等同于先是用 kmalloc() 申请空间 , 然后用 memset() 来初始化 ,所有申请的元素都被初始化为 0. view plain /** * kzal ...

  6. Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt

    PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...

  7. jQuery.attr() 函数详解

    一,jQuery.attr()  函数详解: http://www.365mini.com/page/jquery-attr.htm 二,jQuery函数attr()和prop()的区别: http: ...

  8. memset函数详解

    语言中memset函数详解(2011-11-16 21:11:02)转载▼标签: 杂谈 分类: 工具相关  功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大 ...

  9. CreateFile函数详解

    CreateFile函数详解 CreateFile The CreateFile function creates or opens the following objects and returns ...

随机推荐

  1. ios Https问题

    HTTPS认证过程:   ① 浏览器发送一个连接请求给安全服务器.   ② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器.   ③ 客户浏览器检查服务器送过来的证书是否是由自己信赖的 CA ...

  2. Docker使用link建立容器之间的连接

    我们在使用Docker的时候,经常可能需要连接到其他的容器,比如:web服务需要连接数据库.按照往常的做法,需要先启动数据库的容器,映射出端口来,然后配置好客户端的容器,再去访问.其实针对这种场景,D ...

  3. Jenkins使用FTP进行一键部署及回滚2(Windows)(项目实践)

     转载:http://www.cnblogs.com/EasonJim/p/6295372.html Jenkins使用FTP进行一键部署及回滚2(Windows)(项目实践) 前提: 这一篇是继上一 ...

  4. jdeveloper12.1.3的安装与卸载

    jdeveloper12.1.3的安装步骤:1>安装jdk7.0 2>在命令行中输入:cd C:\Program Files\Java\jdk1.7.0_60\bin 3>命令行安装 ...

  5. mybatis中的factory工厂与Sqlsession

    1.SqlSession的使用范围 SqlSession中封装了对数据库的操作,如:查询.插入.更新.删除等.通过SqlSessionFactory创建SqlSession,而SqlSessionFa ...

  6. vbs执行系统命令

    首先说明一下,我的所有代码都是vbscript,jscript我没有研究过,不过我想也差不多. 关于最基础的语法比如变量的申明,分支,循环,函数的调用,等等这些我就不讲了,不懂得自己看一下. 1.我们 ...

  7. loadrunner12-参数化以及参数化关联

    1.选中需要进行参数化的字段,单击鼠标右键,选择使用参数替换--新建参数. 2.输入参数名称. 3.根据需要进行选择,我这边选择“Yes”. 4.再次选中刚刚参数化的字段,单击鼠标右键,选择 显示参数 ...

  8. MDK5使用技巧

    1.文本美化 修改 修改字体以及颜色如下: 修改用户自定义的关键字,如下: 代码编辑技巧 1.TAB键的妙用 使用TAB键可以整体向右移动相应位,使用SHIFT+TAB键整体左移相应位. 2.快速定位 ...

  9. BI失败的原因

    最最重要的, 要有个清晰的目标和范围. 有些客户, 完全脑袋一热开始上BI, 连根本上要BI来解决什么问题都不知道.作为企业的CIO, 首先要知道上BI项目是不是符合企业的战略目标, 是不是能给企业带 ...

  10. jFinal render为什么不跳转到指定的页面

    jFinal render为什么不跳转到指定的页面 1:需要在你自己的主配置文件里面配置所有页面的文件前缀,没配置默认是项目的根目录 //配置页面访问主路径 me.setBaseViewPath(&q ...