直线拟合算法(续)
来源:互联网 发布:mac 找不到原始项目 编辑:程序博客网 时间:2024/05/16 07:50
直线拟合算法(续)
以前写过一篇博客,介绍直线拟合算法。
http://blog.csdn.net/liyuanbhu/article/details/50866802
给出的代码其实有一点小问题,就是 den = 0 时会出现除以 0 的错误。今天正好也有网友问起这个问题。我就再写一篇短文来说说如何解决这个问题。
首先我们知道:
那么
我们还有关于
带入后得到:
也就是要求
有了这些就可以分析分析了。
Dyy>Dxx 这时数据点落在一条垂直直线上,直线方程为x=x¯ 。Dyy=Dxx 数据均匀分布,找不到特殊的方向,无法拟合直线方程。
按照这个分析,我们可以改进我们的代码:
bool lineFit(const std::vector<cv::Point> &points, double &a, double &b, double &c){ int size = points.size(); if(size < 2) { a = 0; b = 0; c = 0; return false; } double x_mean = 0; double y_mean = 0; for(int i = 0; i < size; i++) { x_mean += points[i].x; y_mean += points[i].y; } x_mean /= size; y_mean /= size; //至此,计算出了 x y 的均值 double Dxx = 0, Dxy = 0, Dyy = 0; for(int i = 0; i < size; i++) { Dxx += (points[i].x - x_mean) * (points[i].x - x_mean); Dxy += (points[i].x - x_mean) * (points[i].y - y_mean); Dyy += (points[i].y - y_mean) * (points[i].y - y_mean); } double lambda = ( (Dxx + Dyy) - sqrt( (Dxx - Dyy) * (Dxx - Dyy) + 4 * Dxy * Dxy) ) / 2.0; double den = sqrt( Dxy * Dxy + (lambda - Dxx) * (lambda - Dxx) ); if(fabs(den) < 1e-5) { if( fabs(Dxx / Dyy - 1) < 1e-5) //这时没有一个特殊的直线方向,无法拟合 { return false; } else { a = 1; b = 0; c = - x_mean; } } else { a = Dxy / den; b = (lambda - Dxx) / den; c = - a * x_mean - b * y_mean; } return true;}
1 0
- 直线拟合算法(续)
- Ransac算法--直线拟合
- 直线拟合算法
- Ransac算法--直线拟合
- C#最小二乘法直线拟合算法
- RANSAC算法做直线拟合
- RANSAC算法做直线拟合
- RANSAC算法做直线拟合
- 【算法研究与实现】最小二乘法直线拟合
- 【算法研究与实现】最小二乘法直线拟合
- 直线拟合
- 直线拟合
- 直线拟合
- 最小二乘法直线拟合、圆拟合
- 最小二乘法直线拟合
- 最小二乘法直线拟合
- 最小二乘法直线拟合
- OpenCV 直线拟合
- 分页
- 几种软负载均衡策略分析
- Android多媒体详解
- Oracle学习笔记(十)——分页显示简单示例
- Java二叉树(二)--根据前序和中序遍历求后序遍历
- 直线拟合算法(续)
- poj3304 Segments
- Integer的秘密
- 安装mysql提示3306端口已经被占用解决方案
- Android Studio报错:Ignoring unknown package filter 'build-tools-23.0.0-preview'Warning:
- hadoop生态系统学习之路(十一)Zookeeper的简单使用
- 服务器启用了TRACE Method如何关闭?
- 四、s3c2440 裸机开发 通用异步收发器UARN
- Atitit.vod 视频播放系统 影吧系统的架构图 架构体系 解决方案