forked from WillBrennan/ImageStitching
-
Notifications
You must be signed in to change notification settings - Fork 0
/
scripts.py
74 lines (63 loc) · 2.81 KB
/
scripts.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'Will Brennan'
# Built-in Modules
import os
import argparse
import logging
# Standard Modules
import cv2
import numpy
# Custom Modules
__doc__ = 'Stitches together frames from video footage to form a large canvas'
logger = logging.getLogger('main')
def get_logger(level=logging.INFO, quiet=False, debug=False, to_file=''):
assert level in [logging.DEBUG, logging.INFO, logging.WARNING, logging.CRITICAL]
logger = logging.getLogger('main')
formatter = logging.Formatter('%(asctime)s - %(funcName)s - %(levelname)s - %(message)s')
if debug:
level = logging.DEBUG
logger.setLevel(level=level)
if not quiet:
if to_file:
fh = logging.FileHandler(to_file)
fh.setLevel(level=level)
fh.setFormatter(formatter)
logger.addHandler(fh)
else:
ch = logging.StreamHandler()
ch.setLevel(level=level)
ch.setFormatter(formatter)
logger.addHandler(ch)
return logger
def get_args(default=None, args_string=''):
if not default:
default = {}
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('paths', type=str, nargs='+', help="Filepath for input video")
parser.add_argument('-q', '--quiet', dest='quiet', action='store_true', help='Disable all logging entirely')
parser.add_argument('-b', '--debug', dest='debug', action='store_true', help='Lower logging level to debug')
parser.add_argument('-s', '--save', dest='save', action='store_true', help='save final stitch')
parser.add_argument('-d', '--display', dest='display', action='store_true', help="display stitching while being conducted")
parser.add_argument('-k', '--knn', dest='knn', default=2, type=int, help="Knn cluster value")
parser.add_argument('-l', '--lowe', dest='lowe', default=0.7, type=float, help='defining distance between points')
parser.add_argument('-m', '--min', dest='min_correspondence', default=10, type=int, help='number of features that need to match')
if args_string:
args_string = args_string.split(' ')
args = parser.parse_args(args_string)
else:
args = parser.parse_args()
return args
def display(title, img, max_size=500000):
assert isinstance(img, numpy.ndarray), 'img must be a numpy array'
assert isinstance(title, str), 'title must be a string'
scale = numpy.sqrt(min(1.0, float(max_size)/(img.shape[0]*img.shape[1])))
shape = (int(scale*img.shape[1]), int(scale*img.shape[0]))
img = cv2.resize(img, shape)
cv2.imshow(title, img)
def save_image(path, result):
name, ext = os.path.splitext(path)
img_path = '{0}.png'.format(name)
logger.debug('writing image to {0}'.format(img_path))
cv2.imwrite(img_path, result)
logger.debug('writing complete')