[MFC] 将多个坐标点拟合出一条直线,并画出

简介: [MFC] 将多个坐标点拟合出一条直线,并画出

参考:https://blog.csdn.net/liyuanbhu/article/details/50866802

描述:

  • 最小二乘法直线拟合(不是常见的一元线性回归算法)
  • 将离散点拟合为 a x + b y + c = 0 型直线
  • 假设每个点的 X Y 坐标的误差都是符合 0 均值的正态分布的。
  • 与一元线性回归算法的区别:一元线性回归算法假定 X 是无误差的,只有 Y 有误差。

注:points为存入多个点的容器,利用已知点,求出直线方程中的系数a,b,c,并在onpaint()函数中画出直线

double a, b, c;
  int size = points.size();
    if(size < 2)
     {
         a = 0;
         b = 0;
         c = 0;
     }
     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) //这时没有一个特殊的直线方向,无法拟合
         {
         }
         else
         {
             a = 1;
             b = 0;
             c = - x_mean;
         }
     }
     else
     {
         a = Dxy / den;
         b = (lambda - Dxx) / den;
         c = - a * x_mean - b * y_mean;
     }
  CDC *pDC1 = m_pic.GetWindowDC();
  CPen pen1(PS_SOLID,1,RGB(0,0,255));
  pDC1->SelectObject(&pen1);
  pDC1->MoveTo((points.at(0).x)/cx*width,-((a*points.at(0).x+c)/b)/cy*height);
  pDC1->LineTo((points.at(4).x)/cx*width,-((a*points.at(4).x+c)/b)/cy*height);

效果:

参考:https://blog.csdn.net/liyuanbhu/article/details/50866802

目录
相关文章
|
1月前
|
算法 计算机视觉
OpenCV(三十七):拟合直线、三角形和圆形
OpenCV(三十七):拟合直线、三角形和圆形
130 0
easyx库绘制bresenham直线
easyx库绘制bresenham直线
|
1月前
|
Python
绘制直线
【5月更文挑战第11天】绘制直线。
20 1
|
1月前
|
计算机视觉
OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合
OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合
206 0
|
6月前
|
计算机视觉 Python
OpenCV中绘制圆和直线
要在OpenCV中绘制圆和直线,可以使用以下方法: 1. 导入所需库:
36 1
|
1月前
|
算法
[Halcon&拟合] 直线、矩形和圆的边缘提取
[Halcon&拟合] 直线、矩形和圆的边缘提取
238 0
|
存储 API 图形学
OpenCV_11 轮廓检测:图像的轮廓+绘制轮廓+轮廓近似+边界矩形+椭圆拟合+直线拟合
轮廓检测指检测图像中的对象边界,更偏向于关注上层语义对象。如OpenCV中的findContours()函数, 它会得到每一个轮廓并以点向量方式存储,除此也得到一个图像的拓扑信息,即一个轮廓的后一个轮廓、前一个轮廓等的索引编号。
1255 0
|
计算机视觉
五、OpenCV绘制线、矩形、圆等基本几何形状
通过javaOpenCV中的Imgproc函数进行简单几何图形的绘制
105 0
五、OpenCV绘制线、矩形、圆等基本几何形状
075.绘制余弦曲线和直线的迭加
075.绘制余弦曲线和直线的迭加
52 0