一、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. ArcGIS GP服务的发布及调用

    参考https://www.jianshu.com/p/5331fa708fe5

  2. mongodb查询速度慢是什么原因?

    mongodb查询速度慢是什么原因? 通过mongodb客户端samus代码研究解决问题         最近有项目需要用到mongodb,于是在网上下载了mongodb的源码,根据示例写了测试代码, ...

  3. CloudStack 全局参数设置

    mem.overprovisioning.factor 内存超分参数 cpu.overprovisioning.factor cpu超分参数

  4. [Training Video - 3] [Java Introduction] [Object Oriented Programming]

    Static and non-Static :  非静态方法(不带static)可以访问静态变量和方法(带static),但是反过来就不行. 类的静态成员(变量和方法)属于类本身,在类加载的时候就会分 ...

  5. linux查看端口号监听状态

    lsof -i:<port> netstat -tunlp | grep <port>

  6. kali下firefox的安装

    在kali的系统中自带了一个firefox分支下的浏览器Iceweasel(Iceweasel是Mozilla Firefox浏览器的Debian再发布版),但是怎么说也配不上kali的强悍气势.还是 ...

  7. 企业搜索引擎开发之连接器connector(二十二)

    下面来分析线程执行类,线程池ThreadPool类 对该类的理解需要对java的线程池比较熟悉 该类引用了一个内部类 /** * The lazily constructed LazyThreadPo ...

  8. TortoiseSVN本地版本控制管理

    TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端.下载地址:https://tortoisesvn.net/downloads.html. 安装好TortoiseSV ...

  9. mysql多个TimeStamp设置(转)

    timestamp设置默认值是Default CURRENT_TIMESTAMP timestamp设置随着表变化而自动更新是ON UPDATE CURRENT_TIMESTAMP 但是由于 一个表中 ...

  10. EAS.Net 在程序里配置组件

    public class BeforStart { /// <summary> /// 程序配置初始化 /// </summary> public static void EA ...