一、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. NInject在函数中使用

    问题,今天我在使用Ajax的时候,发现请求到后台没法得到对象. 原来的写法是这样的: public class Baoming : IHttpHandler { [Inject] public IBL ...

  2. git查看远程仓库地址

    git remote -v

  3. OSX 下 sftp 上传目录到服务器

    使用如下命令: put –r dir mput –r dir

  4. require的路径问题(比较重要)

    dojo.baseUrl baseUrl用来存储dojo.js存放 的跟目录,例如dojo.js的路径是“/web/scripts/dojo-1.3/dojo/dojo.js”则baseUrl为“/w ...

  5. 使用VMWare12.0安装Ubuntu系统

    使用VMWare12.0安装Ubuntu系统 Vmware12的虚拟机的文档说明: http://pubs.vmware.com/workstation-12/index.jsp#com.vmware ...

  6. Android-Activity启动模式-应用场景

    在上一篇博客中,Android-Activity启动模式(launchMode),就介绍了Activity四种启动模式的特点与使用等,但是到底什么样子的场景,去使用什么样子的启动模式呢 Activit ...

  7. Windows和linux通过命令互传文件

    下载pscp https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 放在Windows的c:windows/system32下 ...

  8. 随手记录: MVC自定义提交form

    function mySubmit() { var frm = $('#frm'); var result = frm.valid(); if (ret) { frm.submit(); } else ...

  9. .netcore Swagger 生成 api接口文档

    1, 引用第三方包, Swashbuckle.AspNetCore Swashbuckle.AspNetCore.Swagger Swashbuckle.AspNetCore.SwaggerUI 最简 ...

  10. WP8.1StoreApp(WP8.1RT)---SystemTray的变化

    原Microsoft.Phone.Shell中的SystemTray,已经改到Windows.UI.ViewManagement中StatusBar了. 只能在代码中设置相关属性. 如: 1 2 3 ...