- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试解决 equation , s m' = A[R|t]M'
即
m = K。吨。 M 其中 m, K, M 和 T 的最后一列 [ R | t ] 是已知的。
我想获取 3*3 旋转矩阵的每个元素的值。我有。
这个问题也有人回答了here
但是当我们为m 和M 取新值时,我无法理解如何在每次创建新的方程组后获取 3*3 旋转矩阵的值>.
m 包含以像素为单位的投影点坐标,我在图像上有 16 个不同的点用于相机捕获的图案,并且每个 u 和 v 都有 16 组值。
m=np.array([u,v,1])
K 是我的内在矩阵/相机矩阵/相机内在参数矩阵,我将 fx、fy(焦距)和 cx、cy(主点)的值作为相机内在矩阵
K=np.matrix([ [fx, 0, cx, 0],
[ 0, fy, cy, 0],
[ 0, 0, 1, 0]])
T 是传递给“世界”坐标系到相机坐标系的变换(外部矩阵,[R | t]),我也有Tx、Ty 和 Tz 的值。
T= np.matrix([[x00, x01, x02, Tx],
[x10, x11, x12, Ty],
[x20, x21, x22, Tz],
[0 , 0 , 0 , 1 ]])
M 是笛卡尔坐标系“世界”中点的齐次坐标,即世界坐标空间中 3D 点的坐标。我有来自模式的 16 个点,因此每个 X、Y、Z 我有 16 个不同的值。
M=np.array([X,Y,Z,1])
我的目标是获取矩阵 T 的元素 x00、x01、x02、x10、x11、x12、x20、x21、x22 的值。有人可以帮忙吗??
更多说明:
假设对于m矩阵(以像素为单位的投影点坐标),u和v的值为:
u = [ 337, 337, 316, 317, 302, 302, 291, 292, 338, ...]
和
v =[ 487, 572, 477, 547, 470, 528, 465, 516, 598, ...]
即以像素为单位的第一个投影点的坐标是337(行号)和487(列号)
因此,
对于第一组方程,矩阵,m 会有值,
import sympy as sy
import numpy as np
# m = sy.Matrix([u, v, 1]
m = sy.Matrix([337, 487, 1])
,
对于第二组方程,矩阵,m 会有值,
# m = sy.Matrix([u, v, 1]
m = sy.Matrix([337, 572, 1])
很快...
对于K矩阵(内参矩阵)的值:
K = sy.Matrix([[711.629, 0, 496.220, 0],
[0, 712.682, 350.535, 0],
[0, 0, 0, 1]])
对于 M 矩阵(世界坐标空间中 3D 点的坐标),X、Y 和 Z 的值是:
X = [4.25, 4.25, 5.32, 5.32, 6.27, 6.27, 7.28, 7.28, 4.20, ...]
Y = 0
Z = [0.63, 1.63, 0.63, 1.63, 0.59, 1.59, 0.60, 1.92, 2.92, ...]
对于第一组方程,矩阵M将是
# M=np.array([X,Y,Z,1])
M = sy.Matrix([0.63, 0, 4.25, 1])
,
对于第二组方程,矩阵,M 会有值,
# M=np.array([X,Y,Z,1])
M = sy.Matrix([1.63, 0, 4.25, 1])
很快...
对于 T 矩阵(外部矩阵,[ R | t ]),我们将 Tx, Ty, Tz 的值设置为 0, -1.35, 0 。因此,T矩阵将是:
T = sy.Matrix([[x11, x12, x13, 0],
[x21, x22, x23, -1.32],
[x31, x32, x33, 0],
[0, 0, 0, 1]])
我需要制作九组这样的矩阵方程:m = K * T * M 使用不同的 m 和 M 值,所以我可以从这些方程组中计算出 T 矩阵中 9 个未知数的值。
最佳答案
基本上,您有矩阵方程(使用 OpenCV 文档的符号):
A @ (R @ w + t) == m
其中 A.shape == (3, 3)
, R.shape == (3, 3)
, w.shape == (3 , n)
, t.shape == (3, 1)
, m.shape == (3, n)
, 代表n
指向世界坐标 w
和图像坐标 m
。
这个等式可以重新排列为
w.T @ R.T == (inv(A) @ m - t).T
其中 inv(A)
是 A
的逆。左侧和右侧的形状是 (n, 3)
。这具有矩阵方程的格式,具有 9 个未知数(在 R.T 中)和 n 个方程。在这种形式下,您可以输入 np.linalg.lstsq
以获得最小二乘解决方案 - 假设您的 n >= 3
具有足够的独立点。
这是一个随机数的演示:
import numpy as np
# Setup test case
np.random.seed(1)
R = np.random.randint(-9, 9, size=(3, 3)).astype(np.float64)
t = np.array([1, 1.5, 2]).reshape(3, 1) # column vector
Rt = np.hstack([R, t]) # shape (3, 4)
A = np.diag([0.5, 0.5, 1.0]) # shape (3, 3)
n = 20 # number of points
# M: shape (4, n)
M = np.vstack([np.random.uniform(size=(3, n)), np.ones((1, n))])
m = A @ Rt @ M # m.shape == (3, n)
# Now try to reconstruct R, given A, M, t, and m.
w = M[:3, :] # world XYZ coordinates, shape (3, n)
# Matrix equation: A @ (R @ w + t) == m
# Equivalent to w.T @ R.T == (inv(A) @ m - t).T
RTfit, _, _, _ = np.linalg.lstsq(w.T, (np.linalg.inv(A) @ m - t).T, rcond=None)
Rfit = np.around(RTfit.T, 6)
print(f'Original R:\n{R}\nReconstructed R:\n{Rfit}')
输出:
Original R:
[[-4. 2. 3.]
[-1. 0. 2.]
[-4. 6. -9.]]
Reconstructed R:
[[-4. 2. 3.]
[-1. -0. 2.]
[-4. 6. -9.]]
请注意,您还可以使用三个数据点 (n=3
) 进行精确求解:
Rsolve = np.linalg.solve(w.T[:3], (np.linalg.inv(A) @ m[:, :3] - t).T).T
但在这种情况下,您需要仔细选择您的三个点,否则它不会起作用。
这是对您的数据的尝试:
t = np.array([[0, -1.32, 0]]).T
w = np.array([
[4.25, 4.25, 5.32, 5.32, 6.27, 6.27, 7.28, 7.28, 4.20],
np.zeros(9),
[0.63, 1.63, 0.63, 1.63, 0.59, 1.59, 0.60, 1.92, 2.92]
])
m = np.array([
[337, 337, 316, 317, 302, 302, 291, 292, 338],
[487, 572, 477, 547, 470, 528, 465, 516, 598],
np.ones(9)
])
A = np.array([
[711.629, 0, 496.220],
[712.682, 350.535, 0],
[0, 0, 1]
])
RTfit, _, _, _ = np.linalg.lstsq(w.T, (np.linalg.inv(A) @ m - t).T, rcond=None)
Rfit = np.around(RTfit.T, 6)
print(Rfit)
输出:
array([[-0.040938, 0. , -0.016044],
[ 0.448038, 0. , 0.52933 ],
[ 0.14251 , 0. , 0.127464]])
它无法有意义地求解 R 矩阵的中间列,因为输入的所有 Y 值均为零。 (如果你用 np.linalg.solve
试试这个,你会得到一个奇异矩阵错误。)
拟合不是特别好,绘制 m
和 A @ (R @ w + t)
可以证明:
不匹配意味着不存在与数据一致的 R 矩阵。在您的评论中,您询问 R 矩阵是否是最佳解决方案。它是匹配方程的 LHS 和 RHS 的最佳解决方案(w.T @ Rfit.T
与 (inv(A) @ m - t).T
)。
鉴于上图中存在较大的不匹配,推测生成的 R 矩阵的准确性没有多大意义。很可能是输入数据有问题;点 (m, w)、t 向量或 A 矩阵。
关于python - 如何求解未知矩阵的矩阵方程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62654004/
在我的一门类(class)中,我接到了一项家庭作业,要求我们在谷歌上搜索 Metapost 语言并找到该语言中方程求解功能的用途。 在浏览了 Metapost 用户手册的前十多页后,我发现只有一个原因
你能帮我在 this page 上的谷歌图表上隐藏趋势线上的工具提示(方程)吗? ? 谢谢 以下是我正在使用的图表选项: var options = { title: 'Weight
我正在尝试将 TeXWorks 编辑器配置为使用与 TeXMaker 相同的语法着色。但是,TexWorks 使用正则表达式来指定应该着色的内容。不幸的是,它没有数学的默认设置。 我想匹配 $ 之间的
我刚开始玩 GHCi。我看到列表生成器基本上解决了给定集合中的方程式: Prelude> [x | x [0.01,0.2..2.0] [1.0e-2,0.2,0.39,0.580000000000
是否有可以使用的图形表达式生成器或方程编辑器的 Java 开源实现? 最好有在线演示,或者至少有屏幕截图。 最佳答案 取决于方程的类型。 如果您正在考虑简单的多项式,您可以尝试 Java Expres
我有四个文本输入字段,在用户输入相关值后,我必须进行 JavaScript 计算以将它们全部相加 我使用: var total = Number(value1) + Number(value2) +
为什么这段代码有两个不同的输出(GCC 4.5.1)(我已经评论了重要的行): int main() { bool a = 1; bool b = 1; bool c = 1;
如果标题含糊不清,我深表歉意,但我不知道如何为我的情况命名。我正在为使用 GPS 的 iPhone 编写一个应用程序。在 didUpdateLocations: 方法中,我针对任意大小的变量测试位置的
我正在尝试计算表中学生的 BMI,四舍五入到三位数: +-------+--------+--------+ | fname | weight | height | +-------+--------
我们可以使用 deSolve R 中的常微分方程 (ODE) 包,但是,我找不到解决两个嵌套 ODE 方程的方法,假设` b'(t) = beta - k*b(t); a'(t) = alpha -b
我有一个 boolean 方程,想简化它。帮忙解决一下。 bool needLoad = isA || (!isA && !isB); 之后我使用 if (needLoad){ if (
我很感兴趣,建模工具(在我的例子中是 OpenModelica 和 Dymola - 建模语言 Modelica)如何求解方程组(线性和/或非线性)。这些工具专为求解微分代数方程而设计。我知道一点将微
Julia:当我有绘图时如何找到最佳拟合曲线/方程?我有一个用 map 绘制的图,但我需要找到一个适合它的二次方程? 最佳答案 正如评论中所说,有一个情节在这里并不真正相关;只有数据本身是。您可以使用
我一直在尝试将像 100, 45 这样的输入放入文本框中,并通过单击按钮通过我的方程式运行它,但我不知道该怎么做。单击按钮后,它应该发布答案作为警报。请帮忙。谢谢。 function Rad(a, b
Julia:当我有绘图时如何找到最佳拟合曲线/方程?我有一个用 map 绘制的图,但我需要找到一个适合它的二次方程? 最佳答案 正如评论中所说,有一个情节在这里并不真正相关;只有数据本身是。您可以使用
有人可以向我解释为什么下面的代码会打印字符“u”吗? int p = 9; int q = 5; int r = p - q; double x = p; double y = q; St
我想以某种方式缩短我的 ODE 方程,因为否则代码会变得困惑。我尝试过使用辅助函数,例如这里的 fe() ,但这不起作用。下面的代码只是一个例子,欢迎任何建议!谢谢! # Import the req
我无法创建正确的文件。程序中的方程不会迭代,它只会根据请求的数量写入相同的总和。 for 循环。 #include #include #include #define LEN 256 int m
我有 2 个指向一些 Point 结构的指针。我想计算两点之间的距离(我不需要计算它的根)所以我有这个: w[0]=X[l]; w[1]=X[l+1]; d=m(w[0]->x
我有一个具有 CSV 上传功能的网站,它将 CSV 中的所有内容推送到临时表,然后分成较小的表。 目前,我有一个显示页面,在 HTML 表格中显示所有这些信息。然而,有些部分需要有公式化的表示。换句话
我是一名优秀的程序员,十分优秀!