class TestAlignementTresor(TestCase): def setUp(self): self.positionZoneDepot = (800, 850) self.alignementTresor = AlignementTresor() def test_distance_laterale_negative_retourne_deplacement_gauche(self): distance_x = -200 commande, _ = self.alignementTresor.ajusterPositionX(distance_x) self.assertEqual('left', commande, "Tresor se trouvant a gauche, mais retourne un deplacement a droite") def test_distance_laterale_positive_retourne_deplacement_droite(self): distance_x = 300 commande, _ = self.alignementTresor.ajusterPositionX(distance_x) self.assertEqual('right', commande, "Tresor se trouvant a droite, mais retourne un deplacement a gauche") def test_distance_frontale_positive_retourne_deplacement_avant(self): distance_y = 300 commande, _ = self.alignementTresor.ajusterPositionY(distance_y) self.assertEqual('forward', commande, "tresor se trouvant en avant, mais retourne un deplacement recule") def test_distance_elevee_retourne_deux_ajustements(self): distance_x = 400 distance_y = 320 ajustements = self.alignementTresor.calculerAjustement(distance_x, distance_y) self.assertEqual(len(ajustements), 2, "Tresor mal aligne, mais ne retourne pas le bon nombre d'ajustement") def test_distance_laterale_negligeable_retourne_ajustement_frontal_seulement(self): distance_x = 5 distance_y = 320 ajustements = self.alignementTresor.calculerAjustement(distance_x, distance_y) self.assertEquals(len(ajustements), 1, "Tresor est alignee devant le robot, mais un alignement lateral est calculer")
def __init__(self, image): self.alignementTresor = AlignementTresor() self.imageCamera = image self.positionZone = (805, 950) self.rayonZone = 20 self._definirIntervallesCouleurs() self.alignementTerminer = False self.ajustements = []
def setUp(self): self.positionZoneDepot = (800, 850) self.alignementTresor = AlignementTresor()
class DetectionTresor(object): def __init__(self, image): self.alignementTresor = AlignementTresor() self.imageCamera = image self.positionZone = (805, 950) self.rayonZone = 20 self._definirIntervallesCouleurs() self.alignementTerminer = False self.ajustements = [] def calculerAjustements(self): contoursTresor = self._detecterContoursForme(self.intervalleJaune) if (contoursTresor is not None): distance_x, distance_y = self._trouverDistance(contoursTresor) self.ajustements= self.alignementTresor.calculerAjustement(distance_x, distance_y) else: self.ajustements = None def _trouverDistance(self, contoursTresor): positionZone_x, positionZone_y = self.positionZone position_x, position_y = self._trouverCentreForme(contoursTresor) distance_x = (position_x - positionZone_x) distance_y = (positionZone_y - position_y) return distance_x, distance_y def _trouverCentreForme(self, contoursForme): MatriceCentreMasse = cv2.moments(contoursForme) centre_x = int(MatriceCentreMasse['m10'] / MatriceCentreMasse['m00']) centre_y = int(MatriceCentreMasse['m01'] / MatriceCentreMasse['m00']) return centre_x, centre_y def _detecterContoursForme(self, intervalleCouleur): intervalleFonce, intervalleClair, couleurForme = intervalleCouleur masqueCouleur = cv2.inRange(self.imageCamera, intervalleFonce, intervalleClair) kernel = np.ones((5, 5), np.uint8) masqueFermeture = cv2.morphologyEx(masqueCouleur.copy(), cv2.MORPH_CLOSE, kernel) _, contoursCouleur, _ = cv2.findContours(masqueFermeture.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) if (len(contoursCouleur) > 0): contoursTresor = self._obtenirFormeInteret(contoursCouleur) if (contoursTresor is not None): return contoursTresor else: return None else: return None def _obtenirFormeInteret(self, contoursCouleur): contoursNegligeable = [] for contours in range(len(contoursCouleur)): aire = cv2.contourArea(contoursCouleur[contours]) print(aire) if ((aire < AIRE_MINIMALE) or (aire > AIRE_MAXIMALE)): contoursNegligeable.append(contours) if (len(contoursNegligeable) > 0): contoursCouleur = np.delete(contoursCouleur, contoursNegligeable) if (len(contoursCouleur) == 0): return None else: contoursCouleur.sort() index = len(contoursCouleur) return contoursCouleur[index-1] def _definirIntervallesCouleurs(self): self.intervalleJaune = np.array([0, 90, 90]), np.array([80, 255, 255]), "Jaune"