一、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. C# \/date(1498820611133+0800)\/ 转DateTime

    开发中经常遇到日期转换问题,特别是做接口的时候,现在整理了下时间戳转为C#格式时间的方法: /// <summary> /// 时间戳转为C#格式时间 /// </summary&g ...

  2. jQuery的选择器的总结

    一.简单选择器 // $(function () { // $("#box").css("color","red") // }) // 这个 ...

  3. centos 安装部署.net core站点

    安装 net core sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm s ...

  4. 441. Arranging Coins

    static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...

  5. [转]TCP的拥塞控制

    1.引言 计算机网络中的带宽.交换结点中的缓存和处理机等,都是网络的资源.在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.这种情况就叫做拥塞. 拥塞控制就是防止 ...

  6. PostgreSQL CPU满(100%)性能分析及优化

    业务场景:大批量更新时,数据库长时间CPU占用超过90,影响其他正常业务流程,参考阿里云上的一篇文章:https://help.aliyun.com/knowledge_detail/43562.ht ...

  7. 【转】java遍历实体类的属性和数据类型以及属性值

    和同学接了个外包的活,由于项目中很多地方要用到poi导出excel,而每次导出都要写很多相同的代码,因为poi的cell.setCellValue();每次设置的都是不同实体bean的属性值,导致代码 ...

  8. C++继承-重载-多态-虚函数

    C++ 继承 基类 & 派生类 一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数.定义一个派生类,我们使用一个类派生列表来指定基类.类派生列表以一个或多个基类命名,形式如下: ...

  9. Send [1] times, still failed

    com.alibaba.rocketmq.client.exception.MQClientException: Send [1] times, still failed, cost [696094] ...

  10. centos7 mysql 数据库备份与还原

    数据库备份 show databases; #先查看一下数据库 现在我要备份word数据库 退出mysql输入 mysqldump -u root -p word > word.sql #我把它 ...