当前位置: 首页 > news >正文

OpenCV结构分析与形状描述符(14)拟合直线函数fitLine()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

拟合一条直线到2D或3D点集。

fitLine 函数通过最小化 ∑ i ρ ( r i ) \sum_i \rho(r_i) iρ(ri)来拟合一条直线到2D或3D点集,其中 r i r_i ri 是第i 个点到直线的距离,而 ρ ( r ) \rho(r) ρ(r)是一个距离函数,可以是以下之一:

  • DIST_L2
    ρ ( r ) = r 2 / 2 (the simplest and the fastest least-squares method) \rho (r) = r^2/2 \quad \text{(the simplest and the fastest least-squares method)} ρ(r)=r2/2(the simplest and the fastest least-squares method)

  • DIST_L1
    ρ ( r ) = r \rho (r) = r ρ(r)=r

  • DIST_L12
    ρ ( r ) = 2 ⋅ ( 1 + r 2 2 − 1 ) \rho (r) = 2 \cdot ( \sqrt{1 + \frac{r^2}{2}} - 1) ρ(r)=2(1+2r2 1)

  • DIST_FAIR
    ρ ( r ) = C 2 ⋅ ( r C − log ⁡ ( 1 + r C ) ) where C = 1.3998 \rho \left (r \right ) = C^2 \cdot \left ( \frac{r}{C} - \log{\left(1 + \frac{r}{C}\right)} \right ) \quad \text{where} \quad C=1.3998 ρ(r)=C2(Crlog(1+Cr))whereC=1.3998

  • DIST_WELSCH
    ρ ( r ) = C 2 2 ⋅ ( 1 − exp ⁡ ( − ( r C ) 2 ) ) where C = 2.9846 \rho \left (r \right ) = \frac{C^2}{2} \cdot \left ( 1 - \exp{\left(-\left(\frac{r}{C}\right)^2\right)} \right ) \quad \text{where} \quad C=2.9846 ρ(r)=2C2(1exp((Cr)2))whereC=2.9846

  • DIST_HUBER
    ρ ( r ) = { r 2 2 if  r < C C ⋅ ( r − C 2 ) otherwise 此处 C = 1.345 \rho(r) = \begin{cases} \frac{r^2}{2} & \text{if } r < C \\ C \cdot (r - \frac{C}{2}) & \text{otherwise} \end{cases} 此处C=1.345 ρ(r)={2r2C(r2C)if r<Cotherwise此处C=1.345

该算法基于 M-估计器技术(http://en.wikipedia.org/wiki/M-estimator),该技术迭代地使用加权最小二乘法来拟合直线。在每次迭代之后,权重 w i w_i wi被调整为与 ρ ( r i ) \rho(r_i) ρ(ri)成反比。

函数原型


void cv::fitLine	
(InputArray 	points,OutputArray 	line,int 	distType,double 	param,double 	reps,double 	aeps 
)		

参数

  • 参数points 输入的2D或3D点集,存储在 std::vector<> 或 Mat 中。
  • 参数输出的直线参数。在2D拟合的情况下,它应该是一个包含4个元素的向量(如 Vec4f)—— (vx, vy, x0, y0),其中 (vx, vy) 是与直线共线的归一化向量,(x0, y0) 是直线上的一点。在3D拟合的情况下,它应该是一个包含6个元素的向量(如 Vec6f)—— (vx, vy, vz, x0, y0, z0),其中 (vx, vy, vz) 是与直线共线的归一化向量,(x0, y0, z0) 是直线上的一点。
  • 参数distType 由 M-估计器使用的距离类型,参见 DistanceTypes。
  • 参数param 对某些类型的距离来说的数值参数(C)。如果它是0,则会选择一个最优值。
  • 参数reps 对半径(坐标原点与直线之间的距离)的充分精度。
  • 参数aeps 对角度的充分精度。对于 reps 和 aeps,0.01 是一个好的默认值。

代码示例

#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;int main()
{// 创建一个空白图像Mat img( 400, 400, CV_8UC3, Scalar( 255, 255, 255 ) );// 创建一组2D点vector< Point2f > points;points.push_back( Point2f( 100, 100 ) );points.push_back( Point2f( 200, 100 ) );points.push_back( Point2f( 200, 200 ) );points.push_back( Point2f( 100, 200 ) );points.push_back( Point2f( 150, 150 ) );points.push_back( Point2f( 150, 250 ) );points.push_back( Point2f( 250, 150 ) );points.push_back( Point2f( 250, 250 ) );// 定义输出直线Vec4f line;// 拟合直线fitLine( points, line, DIST_L2, 0, 0.01, 0.01 );// 获取直线参数float vx = line[ 0 ];float vy = line[ 1 ];float x0 = line[ 2 ];float y0 = line[ 3 ];// 计算两点来绘制直线Point p1( x0 - 100 * vx, y0 - 100 * vy );Point p2( x0 + 100 * vx, y0 + 100 * vy );// 在原图上绘制直线cv::line( img, p1, p2, Scalar( 0, 0, 255 ), 2, LINE_8 );// 绘制点集for ( const auto& pt : points ){circle( img, pt, 5, Scalar( 0, 255, 0 ), -1 );}// 显示结果imshow( "Line Fitting", img );waitKey( 0 );return 0;
}

运行结果

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【白话MQ】消息队列MQ的使用和选型
  • 油耳用什么掏耳朵比较好?质量最好的可视挖耳勺推荐
  • 智慧黑板:赋能多学科教学,引领教育新风尚
  • CentOS 系统设置与维护教程
  • Apple发布会都有哪些亮点?如何在苹果手机和电脑上录制屏幕?
  • JVM面试真题总结(六)
  • 深入理解Java虚拟机:Jvm总结-垃圾收集器与内存分配策略
  • 保姆级离线+windows环境+大模型前端UI安装(二)
  • ubuntu 和windows用samba服务器实现数据传输
  • 说说深拷贝和浅拷贝?
  • 共享旅游卡,客户旅游云南,真实反馈,全程无删减!
  • 油耳要怎么清洁耳朵才干净?比较推荐哪种可视耳勺
  • 开发适合el-dialog的拉伸拖拽自定义指令和适配自定义的图片查看组件
  • Java使用Apache POI向Word文档中填充数据
  • 深度学习基础--卷积网络
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • classpath对获取配置文件的影响
  • css系列之关于字体的事
  • EventListener原理
  • JS变量作用域
  • Linux中的硬链接与软链接
  • Making An Indicator With Pure CSS
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python语法速览与机器学习开发环境搭建
  • vue--为什么data属性必须是一个函数
  • 关于extract.autodesk.io的一些说明
  • 好的网址,关于.net 4.0 ,vs 2010
  • 每天10道Java面试题,跟我走,offer有!
  • 使用agvtool更改app version/build
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 正则表达式
  • Nginx实现动静分离
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #stm32整理(一)flash读写
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • (1)SpringCloud 整合Python
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (C++哈希表01)
  • (层次遍历)104. 二叉树的最大深度
  • (二)c52学习之旅-简单了解单片机
  • (二)JAVA使用POI操作excel
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (蓝桥杯每日一题)love
  • (四) 虚拟摄像头vivi体验
  • (算法)N皇后问题
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)3D模板阴影原理