最小二乘法——拟合平面方程(深度相机外参标定、地面标定)

2023-10-07 12:59

本文主要是介绍最小二乘法——拟合平面方程(深度相机外参标定、地面标定),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.最小二乘法

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

最小二乘法的矩阵形式为:
A x = b Ax=b Ax=b
其中 A A A n ∗ k n * k nk 的矩阵, x x x k ∗ 1 k*1 k1 的列向量, b b b n ∗ 1 n*1 n1 的列向量。如果 n > k n>k n>k(方程的个数大于未知量的个数),这个方程系统称为矛盾方程组 Over Determined System,如果 n < k n<k n<k(方程的个数小于未知量的个数),这个系统就是Under Determined System。

当找到向量 x x x 使得 ∣ ∣ A x − b ∣ ∣ ||Ax-b|| Axb 最小,则 x x x 为该方程的最小二乘解

求解最小二乘的方法有奇异值分解、正规方程、QR分解三种。本文中采用正规方程对平面方程进行拟合,以实现深度相机的外参标定。正规方程组的解为:
x = ( A T A ) − 1 A T b x=(A^TA)^{-1}A^Tb x=(ATA)1ATb

2.平面方程拟合

平面方程的一般表达式为
A x + B y + C z + D = 0 ( C ≠ 0 ) Ax+By+Cz+D=0 (C\neq0) Ax+By+Cz+D=0C=0
将其变换为如下形式
z = − A C x − B C y − D C z=-\frac{A}{C}x-\frac{B}{C}y-\frac{D}{C} z=CAxCByCD
a 0 = − A C ; a_0=-\frac{A}{C}; a0=CA; a 1 = − B C ; a_1=-\frac{B}{C}; a1=CB; a 2 = − D C ; a_2=-\frac{D}{C}; a2=CD;
z = a 0 x + a 1 y + a 2 z=a_0x+a_1y+a_2 z=a0x+a1y+a2
此时对应的最小二乘矩阵形式

A = ( x 1 y 1 1 x 2 y 2 1 . . . x n y n 1 ) ; x = ( a 0 a 1 a 2 ) ; b = ( z 1 z 2 . . . z n ) ; ( n ≥ 3 ) A=\begin{pmatrix} x_1&y_1&1\\x_2&y_2&1\\...\\x_n&y_n&1\end{pmatrix}; x=\begin{pmatrix}a_0\\a_1\\a_2\end{pmatrix};b=\begin{pmatrix} z_1 \\ z_2 \\ ...\\ z_n\end{pmatrix};(n\geq3) A=x1x2...xny1y2yn111;x=a0a1a2;b=z1z2...zn;(n3)

其中 ( x 1 , y 1 , z 1 ) , ( x 2 , y 2 , z 2 ) , . . . , ( x n , y n , z n ) (x_1,y_1,z_1),(x_2,y_2,z_2),...,(x_n,y_n,z_n) (x1,y1,z1),(x2,y2,z2),...,(xn,yn,zn)为输入的三维点坐标。

套用正规方程组的解,即可求得 ( a 0 , a 1 , a 2 ) ; (a_0,a_1,a_2); (a0,a1,a2);

3.标定——构造旋转矩阵

在实际使用中,经常会采用地面作为参照平面,将相机坐标系转化为世界坐标系,本文中使用最小二乘法对地面点云拟合平面方程,将相机坐标系Z轴旋转至垂直地面

如上求解出地面的平面方程系数,则平面方程一般式为:
a 0 x + a 1 y − z + a 2 = 0 a_0x+a_1y-z+a_2=0 a0x+a1yz+a2=0
其法向量为:
( a 0 a 0 2 + a 1 2 + 1 , a 1 a 0 2 + a 1 2 + 1 , − 1 a 0 2 + a 1 2 + 1 ) (\frac{a_0}{\sqrt{a_0^2+a_1^2+1}},\frac{a_1}{\sqrt{a_0^2+a_1^2+1}},\frac{-1}{\sqrt{a_0^2+a_1^2+1}}) (a02+a12+1 a0,a02+a12+1 a1,a02+a12+1 1)
求得平面法向量的单位向量为 n ⃗ \vec{n} n
相机坐标系的Z轴向量 z ⃗ \vec{z} z ( 0 , 0 , 1 ) (0,0,1) (0,0,1)
旋转向量为 r ⃗ \vec{r} r ,其中 r ⃗ \vec{r} r 方向为 n ⃗ × z ⃗ \vec{n}\times\vec{z} n ×z ,旋转角度为 θ = a r c c o s ( n ⃗ ⋅ r ⃗ ) \theta=arccos(\vec{n}\cdot\vec{r}) θ=arccos(n r )

使用 Eigen::AngleAxisd 将旋转向量转化为 Eigen::Matrix3d 的旋转矩阵。

4.代码

	//0.最小二乘拟合平面方程//planePoints存储相机坐标系选择地面区域内的所有三维点云Eigen::MatrixXd A(planePoints.size(), 3);Eigen::VectorXd b(planePoints.size());//将观测点输入矩阵for (int i = 0; i < planePoints.size(); i++){A(i, 0) = planePoints[i].x;A(i, 1) = planePoints[i].y;A(i, 2) = 1;b(i) = planePoints[i].z;}Eigen::MatrixXd AT = A.transpose();//使用最小二乘法求得系数向量Eigen::Vector3d x = (AT*A).inverse()*AT*b;//1.求解旋转矩阵//单位法向量double denominator = sqrt(x(0)*x(0) + x(1)*x(1) + 1);Eigen::Vector3d n(x(0) / denominator, x(1) / denominator, -1 / denominator);n = n.normalized();Eigen::Vector3d zdir(0, 0, 1);//求解两向量的旋转向量,点乘求夹角、叉乘求旋转方向。Eigen::AngleAxisd rotateVector(acos(n.dot(zdir)), n.cross(zdir).normalized());//获取旋转矩阵Eigen::Matrix3d zRotateMatrix = rotateVector.matrix();

5.结果

首先选择一系列三维点云(蓝色代表有点云),如下图:

在这里插入图片描述
未转化的相机坐标系下三维点云如下图:

在这里插入图片描述

用上述构造旋转矩阵进行点云坐标系变换,令Z轴方向垂直地面,结果如下:

在这里插入图片描述
在这里插入图片描述

这篇关于最小二乘法——拟合平面方程(深度相机外参标定、地面标定)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/157908

相关文章

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

poj 2175 最小费用最大流TLE

题意: 一条街上有n个大楼,坐标为xi,yi,bi个人在里面工作。 然后防空洞的坐标为pj,qj,可以容纳cj个人。 从大楼i中的人到防空洞j去避难所需的时间为 abs(xi - pi) + (yi - qi) + 1。 现在设计了一个避难计划,指定从大楼i到防空洞j避难的人数 eij。 判断如果按照原计划进行,所有人避难所用的时间总和是不是最小的。 若是,输出“OPETIMAL",若

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回

poj 3422 有流量限制的最小费用流 反用求最大 + 拆点

题意: 给一个n*n(50 * 50) 的数字迷宫,从左上点开始走,走到右下点。 每次只能往右移一格,或者往下移一格。 每个格子,第一次到达时可以获得格子对应的数字作为奖励,再次到达则没有奖励。 问走k次这个迷宫,最大能获得多少奖励。 解析: 拆点,拿样例来说明: 3 2 1 2 3 0 2 1 1 4 2 3*3的数字迷宫,走两次最大能获得多少奖励。 将每个点拆成两个