【OpenCV3】直线拟合--FitLine()函数详解
一、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()函数详解的更多相关文章
- malloc 与 free函数详解<转载>
malloc和free函数详解 本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...
- NSSearchPathForDirectoriesInDomains函数详解
NSSearchPathForDirectoriesInDomains函数详解 #import "NSString+FilePath.h" @implementation ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- Linux C popen()函数详解
表头文件 #include<stdio.h> 定义函数 FILE * popen( const char * command,const char * type); 函数说明 popen( ...
- kzalloc 函数详解(转载)
用kzalloc申请内存的时候, 效果等同于先是用 kmalloc() 申请空间 , 然后用 memset() 来初始化 ,所有申请的元素都被初始化为 0. view plain /** * kzal ...
- Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt
PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...
- jQuery.attr() 函数详解
一,jQuery.attr() 函数详解: http://www.365mini.com/page/jquery-attr.htm 二,jQuery函数attr()和prop()的区别: http: ...
- memset函数详解
语言中memset函数详解(2011-11-16 21:11:02)转载▼标签: 杂谈 分类: 工具相关 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大 ...
- CreateFile函数详解
CreateFile函数详解 CreateFile The CreateFile function creates or opens the following objects and returns ...
随机推荐
- OAuth2.0协议之新浪微博接口演示
新浪微博接口调用数据代码: <?php /** * @ Author : LiBo * @ Date : 2013-10-25 * @ File : weiboapi.php * * @ 说明: ...
- wcf将一个服务同时绑定到http和tcp的写法
服务器端:<?xml version="1.0" encoding="utf-8" ?><configuration> <con ...
- Bind搭建DNS服务
DNS域名解析服务(Domain Name System)是用于解析域名与IP地址对应关系的服务,功能上可以实现正向解析与反向解析: 正向解析:根据主机名(域名)查找对应的IP地址. 反向解析:根据I ...
- 35-Python - 去除list中的空字符
https://www.cnblogs.com/yspass/p/9434366.html list1 = ['122', '2333', '3444', '', '', None] a = list ...
- 25- 解决'python -m pip install --upgrade pip' 报错问题
转载于:https://blog.csdn.net/cxs123678/article/details/80659273 再安装包的时候提示 You are using pip version 9.0 ...
- SQLServer锁的机制
SQLServer锁的机制:共享锁(S)排它锁(X)更新锁(U)意向共享 (IS)意向排它 (IX) 意向排它共享 (SIX)架构修改(Sch-M) 架构稳定性(Sch-S)大容量更新(BU)
- std::time(0)找不到
http://zh.cppreference.com/w/cpp/chrono/c/time #include <ctime> isnan找不到 http://en.cppreferenc ...
- VMWare 虚拟机挂载 Homestead NFS 进行老项目(基于 Brophp)维护
环境: Laravel/homestead + winnfsd VMWare workstation 背景: 众所周知, windows 上成功配置 Homestead 进行开发时,为了解决文件系统的 ...
- Xcode6制作动态及静态Framework[repost]
有没有写SDK或者要将一些常用的工具类做成Framework的经历? 你或许自己写脚本完成了这项工作,相信也有很多的人使用 iOS-Universal-Framework ,随着xCode6的发布,相 ...
- ZOJ3703 Happy Programming Contest 2017-04-06 23:33 61人阅读 评论(0) 收藏
Happy Programming Contest Time Limit: 2 Seconds Memory Limit: 65536 KB In Zhejiang University P ...