def setUp(self):
        path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        texture_filename = "objects/original_texture.png"
        texture = os.path.join(path, texture_filename)

        original_filename = "objects/original.obj"
        original = os.path.join(path, original_filename)

        modified_filename = "objects/modified.obj"
        modified = os.path.join(path, modified_filename)

        image = TextureLoader(texture).load_texture()
        original_face_to_vt, original_edges, original_vt = ObjectLoader(
            original).load_obj()
        modified_face_to_vt, modified_edges, modified_vt = ObjectLoader(
            modified).load_obj()
        SeamEquilizer(modified_edges, modified_vt).equilize()
        self.image_transformer = ImageTransformer(image, original_face_to_vt,
                                                  original_vt,
                                                  modified_face_to_vt,
                                                  modified_vt)

        self.path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        self.transformations = range(0, 12)
        self.face_transformations = range(0, 6)
    def test_patternfy(self):
        path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        texture_filename = "objects/original_texture.png"
        texture = os.path.join(path, texture_filename)

        original_filename = "objects/original.obj"
        original = os.path.join(path, original_filename)

        modified_filename = "objects/modified.obj"
        modified = os.path.join(path, modified_filename)

        save_filename = "test/temp/output.png"
        save = os.path.join(path, save_filename)

        image = TextureLoader(texture).load_texture()
        original_face_to_vt, original_edges, original_vt = ObjectLoader(original).load_obj()
        modified_face_to_vt, modified_edges, modified_vt = ObjectLoader(modified).load_obj()
        SeamEquilizer(modified_edges, modified_vt).equilize()
        image_transformer = ImageTransformer(image, original_face_to_vt, original_vt, modified_face_to_vt, modified_vt)
        transformed_image = image_transformer.transform()
        transformed_image.save(save)

        expected_filename = "objects/expected_output.png"
        expected = os.path.join(path, expected_filename)

        self.assertTrue(self.image_equal(save, expected), expected_filename + " and " + save_filename + " are not equal")
Beispiel #3
0
    def test_patternfy(self):
        path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        texture_filename = "objects/original_texture.png"
        texture = os.path.join(path, texture_filename)

        original_filename = "objects/original.obj"
        original = os.path.join(path, original_filename)

        modified_filename = "objects/modified.obj"
        modified = os.path.join(path, modified_filename)

        save_filename = "test/temp/output.png"
        save = os.path.join(path, save_filename)

        image = TextureLoader(texture).load_texture()
        original_face_to_vt, original_edges, original_vt = ObjectLoader(
            original).load_obj()
        modified_face_to_vt, modified_edges, modified_vt = ObjectLoader(
            modified).load_obj()
        SeamEquilizer(modified_edges, modified_vt).equilize()
        image_transformer = ImageTransformer(image, original_face_to_vt,
                                             original_vt, modified_face_to_vt,
                                             modified_vt)
        transformed_image = image_transformer.transform()
        transformed_image.save(save)

        expected_filename = "objects/expected_output.png"
        expected = os.path.join(path, expected_filename)

        self.assertTrue(
            self.image_equal(save, expected),
            expected_filename + " and " + save_filename + " are not equal")
Beispiel #4
0
def main(args):

    LOGGER.info("loading texture")
    image = TextureLoader(args.texture).load_texture()

    LOGGER.info("loading original OBJ")
    original_face_to_vt, original_edges, original_vt = ObjectLoader(args.original).load_obj()

    LOGGER.info("loading modified OBJ")
    modified_face_to_vt, modified_edges, modified_vt = ObjectLoader(args.modified).load_obj()

    LOGGER.info("seam equilizing")
    SeamEquilizer(modified_edges, modified_vt).equilize()

    LOGGER.info("transforming image")
    image_transformer = ImageTransformer(image, original_face_to_vt, original_vt, modified_face_to_vt, modified_vt)
    transformed_image = image_transformer.transform()
    
    LOGGER.info("saving")
    transformed_image.save(args.save)
                         
    LOGGER.info("success")
    def setUp(self):
        path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        texture_filename = "objects/original_texture.png"
        texture = os.path.join(path, texture_filename)

        original_filename = "objects/original.obj"
        original = os.path.join(path, original_filename)

        modified_filename = "objects/modified.obj"
        modified = os.path.join(path, modified_filename)

        image = TextureLoader(texture).load_texture()
        original_face_to_vt, original_edges, original_vt = ObjectLoader(original).load_obj()
        modified_face_to_vt, modified_edges, modified_vt = ObjectLoader(modified).load_obj()
        SeamEquilizer(modified_edges, modified_vt).equilize()
        self.image_transformer = ImageTransformer(image, original_face_to_vt, original_vt, modified_face_to_vt, modified_vt)

        self.path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        self.transformations = range(0, 12)
        self.face_transformations = range(0, 6)
class ImageTransformerTest(unittest.TestCase):

    def setUp(self):
        path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        texture_filename = "objects/original_texture.png"
        texture = os.path.join(path, texture_filename)

        original_filename = "objects/original.obj"
        original = os.path.join(path, original_filename)

        modified_filename = "objects/modified.obj"
        modified = os.path.join(path, modified_filename)

        image = TextureLoader(texture).load_texture()
        original_face_to_vt, original_edges, original_vt = ObjectLoader(original).load_obj()
        modified_face_to_vt, modified_edges, modified_vt = ObjectLoader(modified).load_obj()
        SeamEquilizer(modified_edges, modified_vt).equilize()
        self.image_transformer = ImageTransformer(image, original_face_to_vt, original_vt, modified_face_to_vt, modified_vt)

        self.path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        self.transformations = range(0, 12)
        self.face_transformations = range(0, 6)

    def test_map_within_range(self):
        mapped = self.image_transformer.map_within_range(250.5)
        assert mapped == 0.5

        random_number = random.random() * 10
        random_mapped = self.image_transformer.map_within_range(random_number)

        assert random_mapped <= 1.0

    def test_find_min_max(self):
        vts = [(1.0, 2.0), (3.0, 10.0)]
        result = self.image_transformer.find_min_max(vts)
        assert result == (2.0, 8.0)

    def test_find_scaling_factors(self):
        #based on loaded data
        factorw, factorh = self.image_transformer.find_scaling_factors()

        assert factorw == 1
        assert factorh == 2

    def test_find_new_image_size(self):
        new_width, new_height = self.image_transformer.find_new_image_size(10, 20)

        assert new_width == 10240
        assert new_height == 20480

    def test_get_img_pt_x(self):
        point = 0.2
        image_point = self.image_transformer.get_img_pt_x(point)
        assert image_point == 204

        point = 0.0
        image_point = self.image_transformer.get_img_pt_x(point)
        assert image_point == 0

    def test_get_img_pt_y(self):
        point = 0.2
        image_point = self.image_transformer.get_img_pt_y(point)
        assert image_point == 819

        point = 0.0
        image_point = self.image_transformer.get_img_pt_y(point)
        assert image_point == 1024

    def test_get_img_pts(self):
        points = [(0.2, 0.0)]
        image_points = self.image_transformer.get_img_pts(points)

        assert image_points == [(204, 1024)]

    def test_get_original_img_pts(self):
        points = [(2.2, 500.0)]
        image_points = self.image_transformer.get_original_img_pts(points)

        assert image_points == [(204, 1024)]

    def test_get_modified_img_pts(self):
        points = [(0.2, 0.0)]
        image_points = self.image_transformer.get_modified_img_pts(points)

        assert image_points == [(204, 1024)]

    def test_get_all_image_points(self):
        #this is from loaded data
        originial, modified = self.image_transformer.get_all_image_points(2)
        expected_original = [(260, 205), (378, 205), (378, 87), (260, 87)]
        expected_modified = [(318, 762), (404, 843), (485, 757), (399, 676)]

        assert originial == expected_original
        assert modified == expected_modified

    def test_apply_transformation_to_image(self):

        counter = 0
        self.image_transformer.modified_image = self.image_transformer.create_new_image()

        for original_face_idx, original_face in self.image_transformer.original_face_to_vts.items():
            original_image_points, modified_image_points = self.image_transformer.get_all_image_points(original_face_idx)
            matrix_computer = MatrixComputer(original_image_points, modified_image_points)
            sections = matrix_computer.get_transforming_triangles()
            matrices = matrix_computer.get_transformations(sections)

            for triangles, matrix in zip(sections, matrices):
                source_triangle, destination_triangle = triangles
                self.image_transformer.apply_transformation_to_image(source_triangle, destination_triangle, matrix)
                filename = self.get_apply_transformation_filename(counter)
                self.image_transformer.modified_image.save(filename)
                counter += 1

        for step_number in self.transformations:
            expected = self.get_expected_applied_filename(step_number)
            actual = self.get_apply_transformation_filename(step_number)
            self.assertTrue(self.image_equal(expected, actual), "transformation_" + str(step_number) + ".pngs are not equal ")

        self.teardown_apply_transformation_to_image()


    def get_apply_transformation_filename(self, step_num):
        transf_filename = "test/temp/transformation_" + str(step_num) + ".png"
        transf_file = os.path.join(self.path, transf_filename)
        return transf_file

    def get_expected_applied_filename(self, step_num):
        transf_filename = "objects/transformations/transformation_" + str(step_num) + ".png"
        transf_file = os.path.join(self.path, transf_filename)
        return transf_file

    def image_equal(self, im1_name, im2_name):
        im1 = Image.open(im1_name)
        im2 = Image.open(im2_name)
        return ImageChops.difference(im1, im2).getbbox() is None

    def teardown_apply_transformation_to_image(self):
        for transf in self.transformations:
            filename = self.get_apply_transformation_filename(transf)
            try: #need a better way to check for if file exists
                os.remove(filename)
            except:
                pass

    def test_transform_image_points(self):
        counter = 0
        self.image_transformer.modified_image = self.image_transformer.create_new_image()

        for original_face_idx, original_face in self.image_transformer.original_face_to_vts.items():
            original_image_points, modified_image_points = self.image_transformer.get_all_image_points(original_face_idx)
            self.image_transformer.transform_image_points(original_image_points, modified_image_points)
            filename = self.get_transform_imgpts_filename(counter)
            self.image_transformer.modified_image.save(filename)
            counter += 1

        for transformation in self.face_transformations:
            expected = self.get_expected_imgpts_filename(transformation)
            actual = self.get_transform_imgpts_filename(transformation)
            self.assertTrue(self.image_equal(expected, actual), "face_transformation_" + str(transformation) + ".pngs are not equal")

        self.teardown_transform_imgpts()

    def get_transform_imgpts_filename(self, step_num):
        transf_filename = "test/temp/face_transformation_" + str(step_num) + ".png"
        transf_file = os.path.join(self.path, transf_filename)
        return transf_file

    def get_expected_imgpts_filename(self, step_num):
        transf_filename = "objects/face_transformations/face_transformation_" + str(step_num) + ".png"
        transf_file = os.path.join(self.path, transf_filename)
        return transf_file

    def teardown_transform_imgpts(self):
        for transf in self.face_transformations:
            filename = self.get_transform_imgpts_filename(transf)
            try: #need a better way to check for if file exists
                os.remove(filename)
            except:
                pass
class ImageTransformerTest(unittest.TestCase):
    def setUp(self):
        path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        texture_filename = "objects/original_texture.png"
        texture = os.path.join(path, texture_filename)

        original_filename = "objects/original.obj"
        original = os.path.join(path, original_filename)

        modified_filename = "objects/modified.obj"
        modified = os.path.join(path, modified_filename)

        image = TextureLoader(texture).load_texture()
        original_face_to_vt, original_edges, original_vt = ObjectLoader(
            original).load_obj()
        modified_face_to_vt, modified_edges, modified_vt = ObjectLoader(
            modified).load_obj()
        SeamEquilizer(modified_edges, modified_vt).equilize()
        self.image_transformer = ImageTransformer(image, original_face_to_vt,
                                                  original_vt,
                                                  modified_face_to_vt,
                                                  modified_vt)

        self.path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        self.transformations = range(0, 12)
        self.face_transformations = range(0, 6)

    def test_map_within_range(self):
        mapped = self.image_transformer.map_within_range(250.5)
        assert mapped == 0.5

        random_number = random.random() * 10
        random_mapped = self.image_transformer.map_within_range(random_number)

        assert random_mapped <= 1.0

    def test_find_min_max(self):
        vts = [(1.0, 2.0), (3.0, 10.0)]
        result = self.image_transformer.find_min_max(vts)
        assert result == (2.0, 8.0)

    def test_find_scaling_factors(self):
        #based on loaded data
        factorw, factorh = self.image_transformer.find_scaling_factors()

        assert factorw == 1
        assert factorh == 2

    def test_find_new_image_size(self):
        new_width, new_height = self.image_transformer.find_new_image_size(
            10, 20)

        assert new_width == 10240
        assert new_height == 20480

    def test_get_img_pt_x(self):
        point = 0.2
        image_point = self.image_transformer.get_img_pt_x(point)
        assert image_point == 204

        point = 0.0
        image_point = self.image_transformer.get_img_pt_x(point)
        assert image_point == 0

    def test_get_img_pt_y(self):
        point = 0.2
        image_point = self.image_transformer.get_img_pt_y(point)
        assert image_point == 819

        point = 0.0
        image_point = self.image_transformer.get_img_pt_y(point)
        assert image_point == 1024

    def test_get_img_pts(self):
        points = [(0.2, 0.0)]
        image_points = self.image_transformer.get_img_pts(points)

        assert image_points == [(204, 1024)]

    def test_get_original_img_pts(self):
        points = [(2.2, 500.0)]
        image_points = self.image_transformer.get_original_img_pts(points)

        assert image_points == [(204, 1024)]

    def test_get_modified_img_pts(self):
        points = [(0.2, 0.0)]
        image_points = self.image_transformer.get_modified_img_pts(points)

        assert image_points == [(204, 1024)]

    def test_get_all_image_points(self):
        #this is from loaded data
        originial, modified = self.image_transformer.get_all_image_points(2)
        expected_original = [(260, 205), (378, 205), (378, 87), (260, 87)]
        expected_modified = [(318, 762), (404, 843), (485, 757), (399, 676)]

        assert originial == expected_original
        assert modified == expected_modified

    def test_apply_transformation_to_image(self):

        counter = 0
        self.image_transformer.modified_image = self.image_transformer.create_new_image(
        )

        for original_face_idx, original_face in self.image_transformer.original_face_to_vts.items(
        ):
            original_image_points, modified_image_points = self.image_transformer.get_all_image_points(
                original_face_idx)
            matrix_computer = MatrixComputer(original_image_points,
                                             modified_image_points)
            sections = matrix_computer.get_transforming_triangles()
            matrices = matrix_computer.get_transformations(sections)

            for triangles, matrix in zip(sections, matrices):
                source_triangle, destination_triangle = triangles
                self.image_transformer.apply_transformation_to_image(
                    source_triangle, destination_triangle, matrix)
                filename = self.get_apply_transformation_filename(counter)
                self.image_transformer.modified_image.save(filename)
                counter += 1

        for step_number in self.transformations:
            expected = self.get_expected_applied_filename(step_number)
            actual = self.get_apply_transformation_filename(step_number)
            self.assertTrue(
                self.image_equal(expected, actual),
                "transformation_" + str(step_number) + ".pngs are not equal ")

        self.teardown_apply_transformation_to_image()

    def get_apply_transformation_filename(self, step_num):
        transf_filename = "test/temp/transformation_" + str(step_num) + ".png"
        transf_file = os.path.join(self.path, transf_filename)
        return transf_file

    def get_expected_applied_filename(self, step_num):
        transf_filename = "objects/transformations/transformation_" + str(
            step_num) + ".png"
        transf_file = os.path.join(self.path, transf_filename)
        return transf_file

    def image_equal(self, im1_name, im2_name):
        im1 = Image.open(im1_name)
        im2 = Image.open(im2_name)
        return ImageChops.difference(im1, im2).getbbox() is None

    def teardown_apply_transformation_to_image(self):
        for transf in self.transformations:
            filename = self.get_apply_transformation_filename(transf)
            try:  #need a better way to check for if file exists
                os.remove(filename)
            except:
                pass

    def test_transform_image_points(self):
        counter = 0
        self.image_transformer.modified_image = self.image_transformer.create_new_image(
        )

        for original_face_idx, original_face in self.image_transformer.original_face_to_vts.items(
        ):
            original_image_points, modified_image_points = self.image_transformer.get_all_image_points(
                original_face_idx)
            self.image_transformer.transform_image_points(
                original_image_points, modified_image_points)
            filename = self.get_transform_imgpts_filename(counter)
            self.image_transformer.modified_image.save(filename)
            counter += 1

        for transformation in self.face_transformations:
            expected = self.get_expected_imgpts_filename(transformation)
            actual = self.get_transform_imgpts_filename(transformation)
            self.assertTrue(
                self.image_equal(expected, actual), "face_transformation_" +
                str(transformation) + ".pngs are not equal")

        self.teardown_transform_imgpts()

    def get_transform_imgpts_filename(self, step_num):
        transf_filename = "test/temp/face_transformation_" + str(
            step_num) + ".png"
        transf_file = os.path.join(self.path, transf_filename)
        return transf_file

    def get_expected_imgpts_filename(self, step_num):
        transf_filename = "objects/face_transformations/face_transformation_" + str(
            step_num) + ".png"
        transf_file = os.path.join(self.path, transf_filename)
        return transf_file

    def teardown_transform_imgpts(self):
        for transf in self.face_transformations:
            filename = self.get_transform_imgpts_filename(transf)
            try:  #need a better way to check for if file exists
                os.remove(filename)
            except:
                pass