OpenCV3.3最小二乘法直线拟合


代码中除了用OpenCV3.3库函数进行直线拟合,还自己根据拟合公式写了一个拟合接口函数,两个拟合出来的效果是一样的。
资源截图
代码片段和文件信息
// LineFit.cpp : 此文件包含 “main“ 函数。程序执行将在此处开始并结束。
//

#include “pch.h“
#include 
#include 
#include 
#include 

using namespace std;
using namespace cv;

//直线拟合
static void LinearFitting(vector xvector y double &slopedouble &interceptdouble &r_square)
{
int size_x = x.size();
int size_y = y.size();
double xmean = 0.0;
double ymean = 0.0;
for (size_t i = 0; i < size_x; i++)
{
xmean += x.at(i);
ymean += y.at(i);
}
xmean /= size_x;
ymean /= size_y;

double sumx2 = 0.0;
double sumy2 = 0.0;
double sumxy = 0.0;

for (size_t i = 0; i < size_x; i++)
{
sumx2 += (x.at(i) - xmean)*(x.at(i) - xmean);
sumy2 += (y.at(i) - ymean)*(y.at(i) - ymean);
sumxy += (y.at(i) - ymean)*(x.at(i) - xmean);
}

slope = sumxy / sumx2;
intercept = ymean - slope * xmean;
r_square = sumxy * sumxy / (sumx2*sumy2);
}


int main()
{
vectorpoints;
//(27 39) (8 5) (8 9) (16 22) (44 71) (35 44) (43 57) (19 24) (27 39) (37 52)

points.push_back(Point(27 39));
points.push_back(Point(8 5));
points.push_back(Point(8 9));
points.push_back(Point(16 22));
points.push_back(Point(44 71));
points.push_back(Point(35 44));
points.push_back(Point(43 57));
points.push_back(Point(19 24));
points.push_back(Point(27 39));
points.push_back(Point(37 52));
Mat src = Mat::zeros(400 400 CV_8UC3);

for (size_t i = 0; i < points.size(); i++)
{
circle(src points[i] 3 Scalar(0 0 255) 1 8);
}

//构建A矩阵 
int N = 2;
Mat A = Mat::zeros(N N CV_64FC1);

for (int row = 0; row < A.rows; row++)
{
for (int col = 0; col < A.cols; col++)
{
for (int k = 0; k < points.size(); k++)
{
A.at(row col) = A.at(row col) + pow(points[k].x row + col);
}
}
}
//构建B矩阵
Mat B = Mat::zeros(N 1 CV_64FC1);
for (int row = 0; row < B.rows; row++)
{

for (int k = 0; k < points.size(); k++)
{
B.at(row 0) = B.at(row 0) + pow(points[k].x row)*points[k].y;
}
}

//A*X=B
Mat X;
//cout << A << endl << B << endl;
solve(A B X DECOMP_LU);
cout << X << endl;
vectorlines;
for (int x = 0; x < src.size().width; x++)
{ // y = b + ax;
double y = X.at(0 0) + X.at(1 0)*x;
printf(“(%d%lf)
“ x y);
lines.push_back(Point(x y));
}
polylines(src lines false Scalar(255 0 0) 1 8);
imshow(“src“ src);

//imshow(“src“ A);
waitKey(0);

return 0;


}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门提示: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2019-04-17 09:02  LineFit
     目录           0  2019-04-17 08:47  LineFit.vs
     目录           0  2019-04-17 08:47  LineFit.vsLineFit
     目录           0  2019-04-20 17:16  LineFit.vsLineFitv15
     文件       31744  2019-04-20 17:16  LineFit.vsLineFitv15.suo
     文件    21962752  2019-04-20 17:16  LineFit.vsLineFitv15Browse.VC.db
     目录           0  2019-04-17 08:51  LineFit.vsLineFitv15ipch
     文件      327680  2019-04-20 17:16  LineFit.vsLineFitv15ipch47e2404320c6cc7b.ipch
     文件      327680  2019-04-17 08:47  LineFit.vsLineFitv15ipch70f61aa27d2d810e.ipch
     目录           0  2019-04-17 15:32  LineFitLineFit
     文件        1434  2019-04-17 08:47  LineFitLineFit.sln
     文件        3340  2019-04-17 15:32  LineFitLineFitLineFit.cpp
     文件        8848  2019-04-17 09:02  LineFitLineFitLineFit.vcxproj
     文件        1155  2019-04-17 08:47  LineFitLineFitLineFit.vcxproj.filters
     文件         165  2019-04-17 08:47  LineFitLineFitLineFit.vcxproj.user
     文件         200  2019-04-17 08:47  LineFitLineFitpch.cpp
     文件         639  2019-04-17 08:47  LineFitLineFitpch.h
     目录           0  2019-04-17 09:02  LineFitLineFitx64
     目录           0  2019-04-17 10:19  LineFitLineFitx64Debug
     文件         608  2019-04-17 10:19  LineFitLineFitx64DebugLineFit.log
     文件      677832  2019-04-17 10:19  LineFitLineFitx64DebugLineFit.obj
     文件     2031616  2019-04-17 09:02  LineFitLineFitx64DebugLineFit.pch
     目录           0  2019-04-17 10:19  LineFitLineFitx64DebugLineFit.tlog
     文件        1522  2019-04-17 10:19  LineFitLineFitx64DebugLineFit.tlogCL.command.1.tlog
     文件       40678  2019-04-17 10:19  LineFitLineFitx64DebugLineFit.tlogCL.read.1.tlog
     文件        1140  2019-04-17 10:19  LineFitLineFitx64DebugLineFit.tlogCL.write.1.tlog
     文件         209  2019-04-17 10:19  LineFitLineFitx64DebugLineFit.tlogLineFit.lastbuildstate
     文件        1492  2019-04-17 10:19  LineFitLineFitx64DebugLineFit.tloglink.command.1.tlog
     文件        3904  2019-04-17 10:19  LineFitLineFitx64DebugLineFit.tloglink.read.1.tlog
     文件         616  2019-04-17 10:19  LineFitLineFitx64DebugLineFit.tloglink.write.1.tlog
     文件        3799  2019-04-17 09:02  LineFitLineFitx64Debugpch.obj
............此处省略7个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)