コード例 #1
0
ファイル: test_matching.py プロジェクト: rbianchi66/pyqt_md
    def testWeightedPoints(self):
        """
        Data una nuvola di punti e una sua copia alla quale viene applicata una rototraslazione,
        vengono aggiunti dei punti differenti a peso nullo alle 2 nuvole.

        la funzione deve restituire esattamente la rototraslazione applicata alla seconda nuvola di punti
        """
        teta = math.pi*2*random.random()
        x1 = math.cos(teta)
        x2 = math.sin(teta)
        x3 = random.random()*self.sf
        x4 = random.random()*self.sf
        T = X(P(x1, x2), P(-x2, x1), P(x3, x4))

        pc1 = [ P( (random.random()-0.5)*self.sf, (random.random()-0.5)*self.sf) for x in xrange(self.cloudSize)]
        pc2 = [ p*T for p in pc1 ]

        rn = random.randint(10,100)
        rand_pc1 = [ P( (random.random()-0.5)*self.sf, (random.random()-0.5)*self.sf) for x in xrange(rn)]
        rand_pc2 = [ P( (random.random()-0.5)*self.sf, (random.random()-0.5)*self.sf) for x in xrange(rn)]

        weights = [1.0 for p in pc1] + [0.0 for x in xrange(rn)]

        mr = points_matching(pc1 + rand_pc1, pc2 + rand_pc2, weights)
        A = X(mr.A)
        self.assertAlmostEquals(A.a.x, T.a.x)
        self.assertAlmostEquals(A.a.y, T.a.y)
        self.assertAlmostEquals(A.b.x, T.b.x)
        self.assertAlmostEquals(A.b.y, T.b.y)
        self.assertAlmostEquals(A.c.x, T.c.x)
        self.assertAlmostEquals(A.c.y, T.c.y)

        self.assertAlmostEquals(self.calcPCErr([ p*A for p in pc1 ], pc2), 0.0, tollerance)
        self.assertNotAlmostEquals(self.calcPCErr([ p*A for p in pc1 + rand_pc1 ], pc2 + rand_pc2), 0.0)
コード例 #2
0
ファイル: test_matching.py プロジェクト: rbianchi66/pyqt_md
    def testIdentity(self):
        """
        Date due identiche nuvole di punti, la trasformazione risultante dovra' essere l'identita'
        """
        pc1 = [ P( (random.random()-0.5)*self.sf, (random.random()-0.5)*self.sf) for x in xrange(self.cloudSize)]
        pc2 = list(pc1)
        mr = points_matching(pc1, pc2)
        A = X(mr.A)
        I = X()
        self.assertAlmostEquals(A.a.x, I.a.x)
        self.assertAlmostEquals(A.a.y, I.a.y)
        self.assertAlmostEquals(A.b.x, I.b.x)
        self.assertAlmostEquals(A.b.y, I.b.y)
        self.assertAlmostEquals(A.c.x, I.c.x)
        self.assertAlmostEquals(A.c.y, I.c.y)

        self.assertAlmostEquals(self.calcPCErr([ p*A for p in pc1 ], pc2), 0.0, tollerance)
コード例 #3
0
ファイル: test_matching.py プロジェクト: rbianchi66/pyqt_md
 def testScaledTrasformation(self):
     """
     Data una nuovola di punti e una sua copia a cui viene applicata una matrice roto-scaling-traslazione
     la funzione dovra' restituire una matrice di rototraslazione che non applichi nessuno scaling
     alla prima nuvola.
     """
     teta = math.pi*2*random.random()
     sf = random.randrange(30,70) / 100
     x1 = math.cos(teta)
     x2 = math.sin(teta)
     x3 = random.random()*self.sf
     x4 = random.random()*self.sf
     T = X(P(x1, x2), P(-x2, x1), P(x3, x4)) * scale(sf)
     pc1 = [ P( (random.random()-0.5)*self.sf, (random.random()-0.5)*self.sf) for x in xrange(self.cloudSize)]
     pc2 = [ p*T for p in pc1 ]
     mr = points_matching(pc1, pc2)
     A = X(mr.A)
     pc1_bis = [ p*A for p in pc1 ]
     # La distanza tra i 2 punti originali deve essere la stessa tra i 2 punti trasformati.
     # In questo modo si e' sicuri che non ci sia stato nessuno scaling
     for (p1, p1bis) , (p2, p2bis) in pairwise( zip(pc1, pc1_bis) ):
         self.assertAlmostEquals(dist(p1,p2), dist(p1bis, p2bis), tollerance)
コード例 #4
0
ファイル: test_matching.py プロジェクト: rbianchi66/pyqt_md
    def testPerfectTrasformation(self):
        """
        Data una nuvola di punti e una sua copia alla quale viene applicata una rototraslazione,
        la funzione deve restituire esattamente la rototraslazione applicata alla seconda nuvola di punti
        """
        teta = math.pi*2*random.random()
        x1 = math.cos(teta)
        x2 = math.sin(teta)
        x3 = random.random()*self.sf
        x4 = random.random()*self.sf
        T = X(P(x1, x2), P(-x2, x1), P(x3, x4))
        pc1 = [ P( (random.random()-0.5)*self.sf, (random.random()-0.5)*self.sf) for x in xrange(self.cloudSize)]
        pc2 = [ p*T for p in pc1 ]
        mr = points_matching(pc1, pc2)
        A = X(mr.A)
        self.assertAlmostEquals(A.a.x, T.a.x)
        self.assertAlmostEquals(A.a.y, T.a.y)
        self.assertAlmostEquals(A.b.x, T.b.x)
        self.assertAlmostEquals(A.b.y, T.b.y)
        self.assertAlmostEquals(A.c.x, T.c.x)
        self.assertAlmostEquals(A.c.y, T.c.y)

        self.assertAlmostEquals(self.calcPCErr([ p*A for p in pc1 ], pc2), 0.0, tollerance)