Ejemplo n.º 1
0
    def select_clone(self, transform_set_ids):
        """
        This method clones transform sets to new transform sets.

        :param list(int) transform_set_ids: The transform set IDs.
        :raises: CommandLineRouteHandlerError
        :rtype: None
        """

        transform_set_model = TransformSetModel()

        for transform_set_id in transform_set_ids:
            result = transform_set_model.select(transform_set_id)
            if result is None:
                raise CommandLineRouteHandlerError(
                    f'Transform set with ID {transform_set_id:08d} not found')

        for transform_set_id in transform_set_ids:
            result = transform_set_model.select(transform_set_id)

            self.select_merge([transform_set_id],
                              name=result[1],
                              fk_frame_sets=result[2],
                              fk_prev_transform_sets=transform_set_id,
                              rejected=True)
Ejemplo n.º 2
0
    def test_delete(self):
        with deepstar_path():
            VideoModel().insert('test1', 'test2')

            FrameSetModel().insert(1)

            transform_set_model = TransformSetModel()
            transform_set_model.insert('test', 1)
            result = transform_set_model.select(1)
            self.assertEqual(result, (1, 'test', 1, None))
            result = transform_set_model.delete(1)
            self.assertTrue(result)
            result = transform_set_model.select(1)
            self.assertIsNone(result)
Ejemplo n.º 3
0
    def select_extract(self, transform_set_ids, name, opts):
        """
        This method runs a transformation plugin over previously created
        transform sets.

        :param list(int) transform_set_id: The transform set IDs.
        :param str name: The name of the transform set extraction plugin to
            use.
        :param dict opts: The dict of options.
        :raises: CommandLineRouteHandlerError
        :rtype: None
        """

        transform_set_model = TransformSetModel()

        for transform_set_id in transform_set_ids:
            result = transform_set_model.select(transform_set_id)
            if result is None:
                raise CommandLineRouteHandlerError(
                    f'Transform set with ID {transform_set_id:08d} not found')

        plugin = Plugin.get('transform_set_select_extract', name)
        if plugin is None:
            raise CommandLineRouteHandlerError(
                f"'{name}' is not a valid transform set extraction "
                f'plugin name')

        for transform_set_id in transform_set_ids:
            try:
                new_transform_set_id = plugin() \
                    .transform_set_select_extract(transform_set_id, opts)
            except ValueError as e:
                raise CommandLineRouteHandlerError(str(e))

            result = transform_set_model.select(new_transform_set_id)

            debug(
                f'transform_set_id={result[0]}, name={result[1]}, '
                f'fk_frame_sets={result[2]}, '
                f'fk_prev_transform_sets={result[3]}', 3)
Ejemplo n.º 4
0
    def select_merge_non_default(self, transform_set_ids, name, opts):
        """
        This method merges multiple transform sets into one transform set.

        :param list(int) transform_set_ids: The transform set IDs.
        :param str name: The name of the transform set merge plugin
            to  use.
        :raises: CommandLineRouteHandlerError
        :rtype: None
        """

        transform_set_model = TransformSetModel()

        for transform_set_id in transform_set_ids:
            result = transform_set_model.select(transform_set_id)
            if result is None:
                raise CommandLineRouteHandlerError(
                    f'Transform set with ID {transform_set_id:08d} not found')

        plugin = Plugin.get('transform_set_select_merge', name)
        if plugin is None:
            raise CommandLineRouteHandlerError(
                f"'{name}' is not a valid transform set merge plugin name")

        try:
            new_transform_set_id = plugin().transform_set_select_merge(
                transform_set_ids, opts)
        except ValueError as e:
            raise CommandLineRouteHandlerError(str(e))

        result = transform_set_model.select(new_transform_set_id)

        debug(
            f'transform_set_id={result[0]}, name={result[1]}, '
            f'fk_frame_sets={result[2]}, '
            f'fk_prev_transform_sets={result[3]}', 3)
    def select_extract(self, frame_set_ids, name, opts):
        """
        This method extracts portions of frames to transform sets.

        :param list(int) frame_set_ids: The frame set IDs.
        :param str name: The name of the frame set extraction plugin to use.
        :param dict opts: The dict of options.
        :raises: CommandLineRouteHandlerError
        :rtype: None
        """

        frame_set_model = FrameSetModel()

        for frame_set_id in frame_set_ids:
            result = frame_set_model.select(frame_set_id)
            if result is None:
                raise CommandLineRouteHandlerError(
                    f'Frame set with ID {frame_set_id:08d} not found')

        plugin = Plugin.get('frame_set_select_extract', name)
        if plugin is None:
            raise CommandLineRouteHandlerError(
                f"'{name}' is not a valid frame set extraction plugin name")

        transform_set_model = TransformSetModel()

        for frame_set_id in frame_set_ids:
            transform_set_id = plugin().frame_set_select_extract(
                frame_set_id, opts)

            result = transform_set_model.select(transform_set_id)

            debug(
                f'transform_set_id={result[0]}, name={result[1]}, '
                f'fk_frame_sets={result[2]}, '
                f'fk_prev_transform_sets={result[3]}', 3)
Ejemplo n.º 6
0
    def delete(self, transform_set_ids):
        """
        This method deletes a transform set from the transform set collection.

        :param list(int) transform_set_ids: The transform set IDs.
        :raises: CommandLineRouteHandlerError
        :rtype: None
        """

        transform_set_model = TransformSetModel()

        for transform_set_id in transform_set_ids:
            result = transform_set_model.select(transform_set_id)
            if result is None:
                raise CommandLineRouteHandlerError(
                    f'Transform set with ID {transform_set_id:08d} not found')

        for transform_set_id in transform_set_ids:
            transform_set_model.delete(transform_set_id)

            shutil.rmtree(TransformSetSubDir.path(transform_set_id))

            debug(f'Transform set {transform_set_id} was successfully deleted',
                  3)
    def transform_set_select_extract(self, transform_set_id, opts):
        """
        This method adjusts color for each transform in a transform set.

        :param int transform_set_id: The transform set ID.
        :param dict opts: The dict of options.
        :raises: ValueError
        :rtype: None
        """

        r = opts.get('r', None)
        g = opts.get('g', None)
        b = opts.get('b', None)

        if r is None and g is None and b is None:
            raise ValueError(
                'The r, g and/or b options are required but were not supplied')

        for channel in [r, g, b]:
            if channel is not None:
                if not re.match('^[+,\\-]\\d+$', channel):
                    raise ValueError(
                        'A color adjustment option value must be formatted as '
                        '+/- followed by a number (e.g. --r=+10)')

        color_adjustments = []

        for index, channel in enumerate([b, g, r]):
            if channel is not None:
                color_adjustments.append(
                    [index, int(channel[1:]),
                     True if (channel[:1] == '+') else False])
            else:
                color_adjustments.append(None)

        transform_set_model = TransformSetModel()

        result = transform_set_model.select(transform_set_id)

        transform_set_id_ = TransformSetModel().insert('adjust_color',
                                                       result[2],
                                                       transform_set_id)

        p1 = TransformSetSubDir.path(transform_set_id_)

        os.makedirs(p1)

        p2 = TransformSetSubDir.path(transform_set_id)
        transform_model = TransformModel()
        length = int(os.environ.get('MODEL_LIST_LENGTH', '100'))
        offset = 0

        while True:
            transforms = transform_model.list(transform_set_id, length=length,
                                              offset=offset, rejected=False)

            if not transforms:
                break

            for transform in transforms:
                transform_id = transform_model.insert(transform_set_id_,
                                                      transform[2],
                                                      transform[3],
                                                      transform[4])

                p3 = TransformFile.path(p2, transform[0], 'jpg')
                p4 = TransformFile.path(p1, transform_id, 'jpg')

                image = cv2.imread(p3)

                image = image.astype(np.short)

                for color_adjustment in color_adjustments:
                    if color_adjustment is not None:
                        image = adjust_color(image, color_adjustment[0],
                                             color_adjustment[1],
                                             color_adjustment[2])

                cv2.imwrite(p4, image, [cv2.IMWRITE_JPEG_QUALITY, 100])

                debug(f'Transform with ID {transform_id:08d} at {p4} '
                      f'extracted from transform with ID {transform[0]:08d} '
                      f'at {p3}', 4)

            offset += length

        return transform_set_id_
Ejemplo n.º 8
0
    def transform_set_select_extract(self, transform_set_id, opts):
        """
        This method crops each transform in a transform set.

        :param int transform_set_id: The transform set ID.
        :param dict opts: The dict of options.
        :raises: ValueError
        :rtype: None
        """

        x1 = int(opts['x1']) if ('x1' in opts) else None
        y1 = int(opts['y1']) if ('y1' in opts) else None
        x2 = int(opts['x2']) if ('x2' in opts) else None
        y2 = int(opts['y2']) if ('y2' in opts) else None

        if x1 is None or y1 is None or x2 is None or y2 is None:
            raise ValueError(
                'The x1, y1, x2 and y2 options are required but were not '
                'supplied')

        transform_set_model = TransformSetModel()

        result = transform_set_model.select(transform_set_id)

        transform_set_id_ = TransformSetModel().insert('crop', result[2],
                                                       transform_set_id)

        p1 = TransformSetSubDir.path(transform_set_id_)

        os.makedirs(p1)

        p2 = TransformSetSubDir.path(transform_set_id)
        transform_model = TransformModel()
        length = int(os.environ.get('MODEL_LIST_LENGTH', '100'))
        offset = 0

        while True:
            transforms = transform_model.list(transform_set_id,
                                              length=length,
                                              offset=offset,
                                              rejected=False)

            if not transforms:
                break

            for transform in transforms:
                transform_id = transform_model.insert(transform_set_id_,
                                                      transform[2],
                                                      transform[3],
                                                      transform[4])

                p3 = TransformFile.path(p2, transform[0], 'jpg')
                p4 = TransformFile.path(p1, transform_id, 'jpg')

                image_1 = cv2.imread(p3)

                image_2 = image_1[y1:y2, x1:x2]

                cv2.imwrite(p4, image_2, [cv2.IMWRITE_JPEG_QUALITY, 100])

                debug(
                    f'Transform with ID {transform_id:08d} at {p4} '
                    f'extracted from transform with ID {transform[0]:08d} '
                    f'at {p3}', 4)

            offset += length

        return transform_set_id_
    def transform_set_select_extract(self, transform_set_id, opts):
        """
        This method resizes each transform in a transform set.

        :param int transform_set_id: The transform set ID.
        :param dict opts: The dict of options.
        :raises: ValueError
        :rtype: None
        """

        height = int(opts['height']) if ('height' in opts) else None
        width = int(opts['width']) if ('width' in opts) else None

        if height is None and width is None:
            raise ValueError(
                'The height or width options are required but were not '
                'supplied')

        transform_set_model = TransformSetModel()

        result = transform_set_model.select(transform_set_id)

        transform_set_id_ = TransformSetModel().insert('resize', result[2],
                                                       transform_set_id)

        p1 = TransformSetSubDir.path(transform_set_id_)

        os.makedirs(p1)

        p2 = TransformSetSubDir.path(transform_set_id)
        transform_model = TransformModel()
        length = int(os.environ.get('MODEL_LIST_LENGTH', '100'))
        offset = 0

        while True:
            transforms = transform_model.list(transform_set_id,
                                              length=length,
                                              offset=offset,
                                              rejected=False)

            if not transforms:
                break

            for transform in transforms:
                transform_id = transform_model.insert(transform_set_id_,
                                                      transform[2],
                                                      transform[3],
                                                      transform[4])

                p3 = TransformFile.path(p2, transform[0], 'jpg')
                p4 = TransformFile.path(p1, transform_id, 'jpg')

                image_1 = cv2.imread(p3)

                if width is not None:
                    image_2 = imutils.resize(image_1, width=width)
                else:
                    image_2 = imutils.resize(image_1, height=height)

                cv2.imwrite(p4, image_2, [cv2.IMWRITE_JPEG_QUALITY, 100])

                debug(
                    f'Transform with ID {transform_id:08d} at {p4} '
                    f'extracted from transform with ID {transform[0]:08d} '
                    f'at {p3}', 4)

            offset += length

        return transform_set_id_
    def transform_set_select_extract(self, transform_set_id, opts):
        """
        This method extracts a slice from a transform set (a subset).

        :param int transform_set_id: The transform set ID.
        :param dict opts: The dict of opts.
        :raises: ValueError
        :rtype: int
        """

        start = int(opts['start']) if ('start' in opts) else None
        end = int(opts['end']) if ('end' in opts) else None

        if start is None or end is None:
            raise ValueError(
                'The start and end options are required but were not '
                'supplied')

        transform_set_model = TransformSetModel()

        result = transform_set_model.select(transform_set_id)

        transform_set_id_ = TransformSetModel().insert('slice', result[2],
                                                       transform_set_id)

        p1 = TransformSetSubDir.path(transform_set_id_)

        os.makedirs(p1)

        p2 = TransformSetSubDir.path(transform_set_id)
        transform_model = TransformModel()
        length = int(os.environ.get('MODEL_LIST_LENGTH', '100'))
        offset = 0
        flag = True

        while flag:
            transforms = transform_model.list(transform_set_id,
                                              length=length,
                                              offset=offset,
                                              rejected=False)

            if not transforms:
                break

            for transform in transforms:
                if transform[0] < start:
                    continue

                if transform[0] > end:
                    flag = False
                    break

                transform_id = transform_model.insert(transform_set_id_,
                                                      transform[2],
                                                      transform[3],
                                                      transform[4])

                p3 = TransformFile.path(p2, transform[0], 'jpg')
                p4 = TransformFile.path(p1, transform_id, 'jpg')

                shutil.copy(p3, p4)

                debug(
                    f'Transform with ID {transform_id:08d} at {p4} '
                    f'extracted from transform with ID {transform[0]:08d} '
                    f'at {p3}', 4)

            offset += length

        return transform_set_id_
Ejemplo n.º 11
0
    def select_merge(self,
                     transform_set_ids,
                     name='merge',
                     fk_frame_sets=None,
                     fk_prev_transform_sets=None,
                     rejected=False):
        """
        This method merges multiple transform sets into one transform set.

        :param list(int) transform_set_ids: The transform set IDs.
        :param str name: The merged transform set's name. The default value is
            'merge'.
        :param int fk_frame_sets: The frame set ID to which this transform set
            corresponds (if any). The default value is None.
        :param int fk_prev_transform_sets: The transform set ID the previous
            transform set in this series of transformations. The default value
            is None.
        :param bool rejected: True if should include rejected else False if
            should not. The default value is False.
        :raises: CommandLineRouteHandlerError
        :rtype: None
        """

        transform_set_model = TransformSetModel()

        for transform_set_id in transform_set_ids:
            result = transform_set_model.select(transform_set_id)
            if result is None:
                raise CommandLineRouteHandlerError(
                    f'Transform set with ID {transform_set_id:08d} not found')

        transform_set_id = transform_set_model.insert(name, fk_frame_sets,
                                                      fk_prev_transform_sets)

        p1 = TransformSetSubDir.path(transform_set_id)

        os.makedirs(p1)

        transform_model = TransformModel()
        length = int(os.environ.get('MODEL_LIST_LENGTH', '100'))

        for transform_set_id_ in transform_set_ids:
            offset = 0
            p2 = TransformSetSubDir.path(transform_set_id_)

            while True:
                transforms = transform_model.list(transform_set_id_,
                                                  length=length,
                                                  offset=offset,
                                                  rejected=rejected)

                if not transforms:
                    break

                for transform in transforms:
                    transform_id = transform_model.insert(
                        transform_set_id, transform[2], transform[3],
                        transform[4])

                    p3 = TransformFile.path(p2, transform[0], 'jpg')
                    p4 = TransformFile.path(p1, transform_id, 'jpg')

                    shutil.copy(p3, p4)

                    debug(
                        f'Transform with ID {transform[0]:08d} at {p3} '
                        f'merged as ID {transform_id:08d} at {p4}', 4)

                offset += length

        result = transform_set_model.select(transform_set_id)

        debug(
            f'transform_set_id={result[0]}, name={result[1]}, '
            f'fk_frame_sets={result[2]}, fk_prev_transform_sets={result[3]}',
            3)
Ejemplo n.º 12
0
    def select_export_dir(self, transform_set_ids, target_dir, opts={}):
        """
        This method exports transform sets to a directory.

        :param list transform_set_ids: The list of transform set IDs.
        :param str target_dir: The directory to which to export the transform
            sets.
        :param dict opts: The dict of options.
        :raises: CommandLineRouteHandlerError
        :rtype: None
        """

        transform_set_model = TransformSetModel()

        for transform_set_id in transform_set_ids:
            result = transform_set_model.select(transform_set_id)
            if result is None:
                raise CommandLineRouteHandlerError(
                    f'Transform set with ID {transform_set_id:08d} not found')

        if not os.path.isdir(target_dir):
            raise CommandLineRouteHandlerError(
                f'{target_dir} is not a directory')

        transform_model = TransformModel()
        length = int(os.environ.get('MODEL_LIST_LENGTH', '100'))
        count = 0

        for tid in transform_set_ids:
            offset = 0
            transform_set_path = TransformSetSubDir.path(tid)

            while True:
                results = transform_model.list(tid,
                                               length=length,
                                               offset=offset,
                                               rejected=False)

                if not results:
                    break

                for transform_id, _, _, _, _ in results:
                    file_path = TransformFile().path(transform_set_path,
                                                     transform_id, 'jpg')
                    if 'format' in opts:
                        filename = opts['format'] % transform_id
                    else:
                        filename = os.path.basename(file_path)

                    target_path = os.path.join(target_dir, filename)
                    shutil.copy(file_path, target_path)
                    count += 1

                    debug(
                        f'Transform with ID {transform_id:08d} at '
                        f'{file_path} exported to {target_path}', 4)

                offset += length

        debug(f'{count} transforms were successfully exported to {target_dir}',
              3)