|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from chessboard_finder import * |
|
import os |
|
import glob |
|
|
|
def saveTiles(tiles, img_save_dir, img_file): |
|
letters = 'ABCDEFGH' |
|
if not os.path.exists(img_save_dir): |
|
os.makedirs(img_save_dir) |
|
|
|
for i in range(64): |
|
sqr_filename = "%s/%s_%s%d.png" % (img_save_dir, img_file, letters[i%8], i/8+1) |
|
|
|
|
|
if tiles.shape != (32,32,64): |
|
PIL.Image.fromarray(tiles[:,:,i]) \ |
|
.resize([32,32], PIL.Image.ADAPTIVE) \ |
|
.save(sqr_filename) |
|
else: |
|
|
|
PIL.Image.fromarray((tiles[:,:,i]*255).astype(np.uint8)) \ |
|
.save(sqr_filename) |
|
|
|
def generateTileset(input_chessboard_folder, output_tile_folder): |
|
|
|
if not os.path.exists(output_tile_folder): |
|
os.makedirs(output_tile_folder) |
|
|
|
|
|
img_files = set(glob.glob("%s/*.png" % input_chessboard_folder))\ |
|
.union(set(glob.glob("%s/*.jpg" % input_chessboard_folder)))\ |
|
.union(set(glob.glob("%s/*.gif" % input_chessboard_folder))) |
|
|
|
num_success = 0 |
|
num_failed = 0 |
|
num_skipped = 0 |
|
|
|
for i, img_path in enumerate(img_files): |
|
print("#% 3d/%d : %s" % (i+1, len(img_files), img_path)) |
|
|
|
img_file = img_path[len(input_chessboard_folder):-4] |
|
|
|
|
|
img_save_dir = "%s/tiles_%s" % (output_tile_folder, img_file) |
|
|
|
if os.path.exists(img_save_dir): |
|
print("\tSkipping existing") |
|
num_skipped += 1 |
|
continue |
|
|
|
|
|
print("---") |
|
print("Loading %s..." % img_path) |
|
img_arr = np.array(loadImageGrayscale(img_path), dtype=np.float32) |
|
|
|
|
|
print("\tGenerating tiles for %s..." % img_file) |
|
corners = findChessboardCorners(img_arr) |
|
tiles = getChessTilesGray(img_arr, corners) |
|
|
|
|
|
if len(tiles) > 0: |
|
print("\tSaving tiles %s" % img_file) |
|
saveTiles(tiles, img_save_dir, img_file) |
|
num_success += 1 |
|
else: |
|
print("\tNo Match, skipping") |
|
num_failed += 1 |
|
|
|
print("\t%d/%d generated, %d failures, %d skipped." % (num_success, |
|
len(img_files) - num_skipped, num_failed, num_skipped)) |
|
|
|
if __name__ == '__main__': |
|
np.set_printoptions(suppress=True, precision=2) |
|
parser = argparse.ArgumentParser(description='Generate tile images for alll chessboard images in input folder') |
|
parser.add_argument('input_folder', metavar='input_folder', type=str, |
|
help='Input image folder') |
|
parser.add_argument('output_folder', metavar='output_folder', type=str, |
|
help='Output tile folder') |
|
args = parser.parse_args() |
|
generateTileset(args.input_folder, args.output_folder) |