TestManyCamerasCircle
parent
56610ce5f7
commit
fba31d99f2
|
@ -18,7 +18,7 @@ from numpy.testing import assert_almost_equal
|
|||
|
||||
import gtsam
|
||||
from gtsam import (Cal3_S2, EssentialMatrix, FundamentalMatrix,
|
||||
PinholeCameraCal3_S2, Point2, Point3, Pose3, Rot3,
|
||||
PinholeCameraCal3_S2, Point2, Point3, Rot3,
|
||||
SimpleFundamentalMatrix, Unit3)
|
||||
|
||||
|
||||
|
@ -216,12 +216,69 @@ class TestTripleF(unittest.TestCase):
|
|||
p.append(p_i)
|
||||
|
||||
# Check that transfer works
|
||||
transferredA = self.transferToA(p[1], p[2])
|
||||
transferredB = self.transferToB(p[0], p[2])
|
||||
transferredC = self.transferToC(p[0], p[1])
|
||||
assert_almost_equal([p[0][0], p[0][1]], [transferredA[0], transferredA[1]], decimal=9)
|
||||
assert_almost_equal([p[1][0], p[1][1]], [transferredB[0], transferredB[1]], decimal=9)
|
||||
assert_almost_equal([p[2][0], p[2][1]], [transferredC[0], transferredC[1]], decimal=9)
|
||||
assert_almost_equal(p[0], self.transferToA(p[1], p[2]), decimal=9)
|
||||
assert_almost_equal(p[1], self.transferToB(p[0], p[2]), decimal=9)
|
||||
assert_almost_equal(p[2], self.transferToC(p[0], p[1]), decimal=9)
|
||||
|
||||
|
||||
class TestManyCamerasCircle(unittest.TestCase):
|
||||
N = 6
|
||||
|
||||
def setUp(self):
|
||||
# Generate six cameras on a circle, looking in
|
||||
self.cameraPoses = SFMdata.posesOnCircle(self.N, 1.0)
|
||||
self.focalLength = 1000.0
|
||||
self.principalPoint = Point2(640 / 2, 480 / 2)
|
||||
self.manyFs = self.generateManyFs(self.cameraPoses)
|
||||
|
||||
def generateManyFs(self, cameraPoses):
|
||||
F = []
|
||||
for i in range(self.N):
|
||||
j = (i + 1) % self.N
|
||||
iPj = cameraPoses[i].between(cameraPoses[j])
|
||||
E = EssentialMatrix(iPj.rotation(), Unit3(iPj.translation()))
|
||||
F_ij = SimpleFundamentalMatrix(
|
||||
E, self.focalLength, self.focalLength, self.principalPoint, self.principalPoint
|
||||
)
|
||||
F.append(F_ij)
|
||||
return F
|
||||
|
||||
def test_Conversion(self):
|
||||
for i in range(self.N):
|
||||
expected = self.manyFs[i].matrix()
|
||||
convertedF = FundamentalMatrix(self.manyFs[i].matrix())
|
||||
# Check equality of F-matrices up to a scale
|
||||
actual = convertedF.matrix()
|
||||
scale = expected[1, 2] / actual[1, 2]
|
||||
actual *= scale
|
||||
# print(f"\n{np.round(expected, 3)}", f"\n{np.round(actual, 3)}")
|
||||
assert_almost_equal(expected, actual, decimal=4)
|
||||
|
||||
def test_Transfer(self):
|
||||
# Now project a point into the six cameras
|
||||
P = Point3(0.1, 0.2, 0.3)
|
||||
K = Cal3_S2(self.focalLength, self.focalLength, 0.0, self.principalPoint[0], self.principalPoint[1])
|
||||
|
||||
p = []
|
||||
for i in range(self.N):
|
||||
# Project the point into each camera
|
||||
camera = PinholeCameraCal3_S2(self.cameraPoses[i], K)
|
||||
p_i = camera.project(P)
|
||||
p.append(p_i)
|
||||
|
||||
# Check that transfer works
|
||||
for a in range(self.N):
|
||||
b = (a + 1) % self.N
|
||||
c = (a + 2) % self.N
|
||||
# We transfer from a to b and from c to b,
|
||||
# and check that the result lines up with the projected point in b.
|
||||
transferred = gtsam.EpipolarTransfer(
|
||||
self.manyFs[a].matrix().transpose(), # need to transpose for a->b
|
||||
p[a],
|
||||
self.manyFs[c].matrix(),
|
||||
p[c],
|
||||
)
|
||||
assert_almost_equal(p[b], transferred, decimal=9)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
Loading…
Reference in New Issue