我发现Java中SVDecomp函数的结果与WolframAlpha的结果非常不同。
输入矩阵对于OpenCV和WolframAlpha是完全相同的
{{0.2229632566816983, 18.15370964847313, 4.87085706173828},
{-14.31728552253419, 2.642676839378287, -33.69501515553716},
{-2.982323803144884, 33.70091859922499, 0.8997452211463326}}
以下是WolframAlpha的结果:
U = (-0.441818862735368 | 0.214800119324567 | -0.871009185525260
-0.245069575462508 | -0.962880608842737 | -0.113145200062862
-0.862981457340684 | 0.163468167704881 | 0.478059789601005)
W = (38.5925763913943 | 0 | 0
0 | 36.8337256561100 | 0
0 | 0 | 3.76859638821616×10^-10)
V = (0.155053443270976 | 0.362336795687042 | 0.919059560758203
-0.978207790691182 | 0.186347267503429 | 0.0915653543928191
0.138086740713550 | 0.913228745925823 | -0.383334461865688)
下面是OpenCV在使用SCDecomp时产生的结果:
U: [0.4418188627353685, 0.2148001193245664, -0.8710091855252606;
0.2450695754625076, -0.9628806088427376, -0.113145200062862;
0.8629814573406845, 0.1634681677048805, 0.4780597896010051]
W: [38.59257639139431; 36.83372565611004; 3.768597946996713e-10]
VT:[-0.155053443270976, 0.3623367956870423, 0.9190595607582029;
0.9782077906911818, 0.1863472675034285, 0.09156535439281914;
-0.1380867407135498, 0.9132287459258235, -0.3833344618656882]
要提一下:W在OpenCV中不是一个矩阵,而且值的符号有时也不同。
这是一个bug吗?这是我的源代码
Core.SVDecomp(E, w, u, vt);
我不认为结果有那么大的不同:
-
两个U矩阵包含相同的向量,第一个(每个矩阵的第一列)是另一个的对立面(这里没有问题,只是符号改变)
-
W是相同的,但在第一种情况下作为对角矩阵返回,在第二种情况下作为向量返回(只返回主对角)。
-
V矩阵与U矩阵相同(第一个向量相反)。
所以结果是一样的