image_height = int(config_parser.get('training', 'image_height'))

    # Load images for training.
    logger = Logger()
    logger.log(Logger.INFO, "Loading images to train SVM classifier.")
    positive_images = Files(path_pre_processed_positive)
    negative_images = Files(path_pre_processed_negative)
    samples = []
    responses = []

    for file_path in positive_images.paths:
        # Load image.
        image = Image(file_path)

        # Convert and equalize image.
        image.convert_to_gray()

        # Add image for training.
        samples.append(image)
        responses.append(1)

    for file_path in negative_images.paths:
        # Load image.
        image = Image(file_path)
        image.convert_to_gray()

        # Add negative images for training.
        for i in range(1):
            x = int(np.random.random() * (image.width - image_width - 1))
            y = int(np.random.random() * (image.height - image_height - 1))
            negative = image.crop(Point(x, y),
Example #2
0
 character_validator = CharacterValidator()
 number_labels = []
 number_images = []
 letter_labels = []
 letter_images = []
 
 for index in range(len(positive_images.paths)):
     file_path = positive_images.paths[index]
     
     # Load image and configuration data.
     image_original = Image(file_path)
     config_data = ConfigData(Quadrilaterals(), file_path)
     config_data.read_data()
     
     # Convert and equalize image.
     image_original.convert_to_gray()
               
     for quadrilateral in config_data.quadrilaterals.data:
         # Crop image using configuration data.         
         image = crop_image(image_original, quadrilateral, int(image_width), int(image_height))
         image = pre_process_license_plate_image(image, adaptative=True)
         point1 = quadrilateral.points[0]
         point2 = quadrilateral.points[2]
         width =  point2.x -point1.x
         height = point2.y -point1.y
         
         license_plate = Rect([point1.x, point1.y, width, height])
         license_plate.image = image
         license_plate.subrects = image.compute_rectangles_for_characters()
         character_validator.remove_wrong_characters(license_plate)
         license_plate = character_validator.adjust_characters(license_plate, image_original, image_width)
Example #3
0
def pre_processing(argv):
    '''
    Pre process image files to train detector.
    '''
    # Parses args.
    arg_parser = ArgumentParser(description='Load and plot image.')
    arg_parser.add_argument('-c',
                            '--config',
                            dest='config_file',
                            default='config.ini',
                            help='Configuration file')
    args = vars(arg_parser.parse_args())

    # Parses configuration file.
    config_parser = SafeConfigParser()
    config_parser.read(args['config_file'])
    path_original_positive = config_parser.get('data',
                                               'path_original_positive')
    path_original_negative = config_parser.get('data',
                                               'path_original_negative')
    path_pre_processed_positive = config_parser.get(
        'data', 'path_pre_processed_positive')
    path_pre_processed_negative = config_parser.get(
        'data', 'path_pre_processed_negative')
    path_training_vec = config_parser.get('data', 'path_training_vec')
    total_positive_files = config_parser.get('training',
                                             'total_positive_files')
    image_width = config_parser.get('training', 'image_width')
    image_height = config_parser.get('training', 'image_height')
    training_width = config_parser.get('training', 'training_width')
    training_height = config_parser.get('training', 'training_height')

    # Removing old files.
    logger = Logger()
    logger.log(Logger.INFO, "Removing old files.")
    files = Files(path_pre_processed_positive, True)
    files.remove()
    files = Files(path_pre_processed_negative, True)
    files.remove()
    files = Files(path_training_vec, True)
    files.remove()

    # Pre process positive images.
    logger.log(Logger.INFO, "Pre-processing positive images.")
    positive_images = Files(path_original_positive)

    for file_path in positive_images.paths:
        # Load image and configuration data.
        image = Image(file_path)
        config_data = ConfigData(Quadrilaterals(), file_path)
        config_data.read_data()

        # Convert and equalize image.
        image.convert_to_gray()
        image.equalize()

        # Get file name and extension.
        base_name = os.path.splitext(ntpath.basename(file_path))
        file_name = base_name[0]
        extension = base_name[1]

        index_quadrilateral = 0
        for quadrilateral in config_data.quadrilaterals.data:
            # Crop image using configuration data.
            license_plate = crop_image(image, quadrilateral, int(image_width),
                                       int(image_height))

            # Save image.
            save_image_path = os.path.abspath(path_pre_processed_positive +
                                              file_name + "_" +
                                              str(index_quadrilateral) +
                                              extension)
            license_plate.save(save_image_path)

            index_quadrilateral += 1

    # Pre process negative images.
    logger.log(Logger.INFO, "Pre-processing negative images.")
    negative_images = Files(path_original_negative)

    for file_path in negative_images.paths:
        # Load image.
        image = Image(file_path)

        # Convert and equalize image.
        image.convert_to_gray()
        image.equalize()

        # Get base name.
        base_name = ntpath.basename(file_path)

        # Save image.
        save_image_path = os.path.abspath(path_pre_processed_negative +
                                          base_name)
        image.save(save_image_path)

    # Save detector_training image paths in txt files.
    save_training_images_paths(path_pre_processed_positive,
                               path_pre_processed_negative)

    # Generating samples.
    logger.log(Logger.INFO, "Generating samples.")
    call([
        "perl", 'lib/generate_samples.pl', 'positive.txt', 'negative.txt',
        path_training_vec,
        str(int(total_positive_files) + 500),
        'opencv_createsamples -bgcolor 0 -bgthresh 0 -maxxangle 1.1\ -maxyangle 1.1 maxzangle 0.5 -maxidev 40 -w '
        + str(training_width) + ' -h ' + str(training_height)
    ])

    # Merging data for detector_training.
    path_training_vec_file = "positive.vec"
    logger.log(
        Logger.INFO,
        "Merging data for detector_training in: " + path_training_vec_file)
    merge_vec_files(path_training_vec, path_training_vec_file)