一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

输入一个三维点的数组 

std::vectorcv::Point3f Points3ds;

找到一个平面

Z=Ax+By+C
根据最小二乘法,使各个点到这个平面的距离最近:

 求使得S最小的ABC的数值
首先取得最小值时,对各参数偏导数为零。

 代码如下:

复制代码
 1 void CaculateLaserPlane(std::vector<cv::Point3f> Points3ds,vector<double> &res)
 2 {
 3     //最小二乘法拟合平面
 4     //获取cv::Mat的坐标系以纵向为x轴,横向为y轴,而cvPoint等则相反
 5     //系数矩阵
 6     cv::Mat A = cv::Mat::zeros(3, 3, CV_64FC1);
 7     //
 8     cv::Mat B = cv::Mat::zeros(3, 1, CV_64FC1);
 9     //结果矩阵
10     cv::Mat X = cv::Mat::zeros(3, 1, CV_64FC1);
11     double x2 = 0, xiyi = 0, xi = 0, yi = 0, zixi = 0, ziyi = 0, zi = 0, y2 = 0;
12     for (int i = 0; i < Points3ds.size(); i++)
13     {
14         x2 += (double)Points3ds[i].x * (double)Points3ds[i].x;
15         y2 += (double)Points3ds[i].y * (double)Points3ds[i].y;
16         xiyi += (double)Points3ds[i].x * (double)Points3ds[i].y;
17         xi += (double)Points3ds[i].x;
18         yi += (double)Points3ds[i].y;
19         zixi += (double)Points3ds[i].z * (double)Points3ds[i].x;
20         ziyi += (double)Points3ds[i].z * (double)Points3ds[i].y;
21         zi += (double)Points3ds[i].z;
22     }
23     A.at<double>(0, 0) = x2;
24     A.at<double>(1, 0) = xiyi;
25     A.at<double>(2, 0) = xi;
26     A.at<double>(0, 1) = xiyi;
27     A.at<double>(1, 1) = y2;
28     A.at<double>(2, 1) = yi;
29     A.at<double>(0, 2) = xi;
30     A.at<double>(1, 2) = yi;
31     A.at<double>(2, 2) = Points3ds.size();
32     B.at<double>(0, 0) = zixi;
33     B.at<double>(1, 0) = ziyi;
34     B.at<double>(2, 0) = zi;
35     //计算平面系数
36     X = A.inv() * B;
37     //A
38     res.push_back(X.at<double>(0, 0));
39     //B
40     res.push_back(X.at<double>(1, 0));
41     //Z的系数为1
42     res.push_back(1.0);
43     //C
44     res.push_back(X.at<double>(2, 0));
45     return;
46 }
复制代码

 

posted on   一杯清酒邀明月  阅读(1084)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2021-05-25 Qt QSS QComboBox
2021-05-25 Qt Spinbox,DateTimeEdit等控件样式表:箭头在左右两边QSS代码示例
2021-05-25 Qt 去掉QMessageBox标题栏上的图标
2021-05-25 Qt QSS QCheckBox和QRadioButton
2020-05-25 Qt 错误GL/gl.h: No such file or directory的解决方法
2020-05-25 Qt 解决Could not start process "make" qmake_all问题
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示