Updated docstrings to use sphinx style directives.

master
Rostislav Lán 2 years ago
parent 6ef8bfe446
commit 7cd8f0e2de

@ -1,6 +1,7 @@
"""! @file config_parser.py """Config parser for fingerprint filtering and 3d model generation application.
@brief Config parser for fingerprint filtering and 3d model generation application
@author xlanro00 .. moduleauthor:: xlanro00
""" """
from os.path import exists from os.path import exists
@ -9,7 +10,8 @@ import hashlib
import log import log
def save_preset(filters, params, preset_name): def save_preset(filters, params, preset_name):
'''Save filter preset to database. '''Save filter list from command line to database.
:param filters: list of filters to be saved :param filters: list of filters to be saved
:param preset_name: name of preset to be saved :param preset_name: name of preset to be saved
''' '''
@ -34,6 +36,7 @@ def save_preset(filters, params, preset_name):
def store_to_db(preset, preset_name): def store_to_db(preset, preset_name):
'''Store filter preset to database. '''Store filter preset to database.
:param preset: dictionary of filter preset to be stored :param preset: dictionary of filter preset to be stored
:param preset_name: name of preset to be stored :param preset_name: name of preset to be stored
''' '''
@ -73,8 +76,12 @@ def store_to_db(preset, preset_name):
def parse_conf(preset_name, filters, params, config_file): def parse_conf(preset_name, filters, params, config_file):
'''Parse configuration file if one was given. '''Parse configuration file if one was specified.
Store filters and their parameters.
:param preset_name: preset name to be loaded
:param filters: list of filters to be loaded
:param params: dictionary of filter parameters to be loaded
:param config_file: path to config file
''' '''
if not exists(config_file): if not exists(config_file):
@ -103,12 +110,12 @@ def parse_conf(preset_name, filters, params, config_file):
def parse_params(params): def parse_params(params):
'''Parse parameters of filters. Set to None if parameter is not given. '''Parse parameters of filters. Set to None if parameter is not specified.
They are later set to default values in the filter method apply. These are later set to default values in the filter method apply.
:param params: dictionary of filter parameters :param params: dictionary of filter parameters
''' '''
# TODO: possibly too bloated, sending all possible params to each filter
possible_params = {"sigma", "ksize", "kernel", possible_params = {"sigma", "ksize", "kernel",
"diameter", "sigmaColor", "sigmaSpace", "diameter", "sigmaColor", "sigmaSpace",
"patch_size", "patch_distance", "weight", "patch_size", "patch_distance", "weight",

@ -1,6 +1,7 @@
"""! @file filters.py """Filter library for the application
@brief Filter library for the application
@author xlanro00 .. moduleauthor:: xlanro00
""" """
import numpy as np import numpy as np
@ -349,6 +350,8 @@ class binarize_otsu(img_filter):
class add_margin(img_filter): class add_margin(img_filter):
''' Add margin to the image.
'''
def init(self, img): def init(self, img):
super().__init__(img) super().__init__(img)

@ -1,21 +1,22 @@
"""! @file log.py """Module with logging functions
@brief File with printing functions
@author xlanro00 .. moduleauthor:: xlanro00
""" """
import sys import sys
def print_message(*args, **kwargs): def print_message(*args, **kwargs):
'''Print given message to stderr. '''Print given message to stderr.
:param message: message to be printed :param message: message to be printed to stderr
''' '''
print("APP:", *args, file=sys.stderr, **kwargs) print("APP:", *args, file=sys.stderr, **kwargs)
def error_exit(error_message): def error_exit(error_message):
'''Print given error message and exit the application. '''Print given error message to stderr and exit the application.
:param message: error message to be printed :param message: error message to be printed to stderr
''' '''
print("ERROR: " + error_message, file=sys.stderr) print("ERROR: " + error_message, file=sys.stderr)

@ -1,6 +1,7 @@
"""! @file main.py """Main file of the project, contains filtering and stl generation functions
@brief Main file for the application
@author xlanro00 .. moduleauthor:: xlanro00
""" """
# Import basic libraries # Import basic libraries
@ -121,6 +122,8 @@ class fingerprint_app:
self.args = parser.parse_args() self.args = parser.parse_args()
def parse_stl(self): def parse_stl(self):
'''Parse arguments for stl generation.
'''
# Get stl filename # Get stl filename
self.stl_path = self.output_file.rsplit('/', 1)[0] + '/' self.stl_path = self.output_file.rsplit('/', 1)[0] + '/'
self.mode = self.args.stl[0] self.mode = self.args.stl[0]
@ -221,7 +224,8 @@ class fingerprint_app:
return fig, ax return fig, ax
def mirror_image(self): def mirror_image(self):
'''Mirror image using opencv, should be used if we want a positive model. '''Mirror image using opencv.
Should be used to cancel implicit mirroring.
''' '''
log.print_message("Mirroring image") log.print_message("Mirroring image")
@ -251,6 +255,9 @@ class fingerprint_app:
def save_image(self, fig, ax): def save_image(self, fig, ax):
'''Save processed image to the output file. '''Save processed image to the output file.
:param fig: figure used to render image.
:param ax: Ax used to render image.
''' '''
log.print_message("Saving image to", self.output_file) log.print_message("Saving image to", self.output_file)
@ -262,7 +269,7 @@ class fingerprint_app:
# ------------------------- STL GENERATION -------------------------# # ------------------------- STL GENERATION -------------------------#
def run_stl(self): def run_stl(self):
'''Make heightmap, create mesh and save as stl file. '''Choose correct generation code based on mode.
''' '''
self.prepare_heightmap() self.prepare_heightmap()
@ -286,8 +293,8 @@ class fingerprint_app:
def prepare_heightmap(self): def prepare_heightmap(self):
'''Scale image values to get values from 0 to 255. '''Scale image values to get values from 0 to 255.
Then compute base and papilar lines height.
Check validity of dimension parameters. Check validity of dimension parameters.
Then compute base and papilar lines height.
Prepare meshgrid, array which later serves to store point coordinates. Prepare meshgrid, array which later serves to store point coordinates.
''' '''
@ -344,7 +351,7 @@ class fingerprint_app:
def get_ID(self): def get_ID(self):
'''Get a unique ID for the model, which is used in filename and on the model backside. '''Get a unique ID for the model, which is used in filename and on the model backside.
Also create parameter string for stl header, which is used to create ID using hash function SHA512. Also create parameter string for stl header, which is used to create ID using hash function MD5.
''' '''
# these are the same for all types of models # these are the same for all types of models
@ -412,7 +419,10 @@ class fingerprint_app:
self.param_string.encode('utf-8')).hexdigest())[:10] self.param_string.encode('utf-8')).hexdigest())[:10]
def append_faces(self, faces, c): def append_faces(self, faces, c):
''' Function to add faces to the list of faces. '''Add faces to the list of faces.
:param faces: Array with faces.
:param c: Indices of currently added faces.
''' '''
faces.append([c, c + 1, c + 2]) faces.append([c, c + 1, c + 2])
@ -422,6 +432,9 @@ class fingerprint_app:
def engrave_text(self, bottom_vert_arr, top_vert_arr): def engrave_text(self, bottom_vert_arr, top_vert_arr):
'''Engrave text on the back of the model. '''Engrave text on the back of the model.
Create an empty image, fill it with color and draw text on it. Create an empty image, fill it with color and draw text on it.
:param bottom_vert_arr: Bottom vertex array.
:param top_vert_arr: Top vertex array
''' '''
fig, ax = self.get_empty_figure() fig, ax = self.get_empty_figure()
@ -448,14 +461,11 @@ class fingerprint_app:
fig.canvas.draw() fig.canvas.draw()
data = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8) data = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,)) data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,))
plt.close()
# scale inscription layer to suitable height # scale inscription layer to suitable height
data = (data/255)/10 data = (data/255)/10
plt.close()
# TODO: this is very badly written, fix it
# TODO: this sometimes generates invalid mesh, fix it
# add the bottom array # add the bottom array
OFFSET = 0.01 OFFSET = 0.01
@ -464,6 +474,8 @@ class fingerprint_app:
for j in range(self.width): for j in range(self.width):
bottom_vert_arr[i][j][2] = data[i][j][0] bottom_vert_arr[i][j][2] = data[i][j][0]
elif self.mode == "c": elif self.mode == "c":
# TODO: this is very badly written, fix it, why is teh offset needed at all?
# TODO: this sometimes generates invalid mesh, fix it
for j in range(self.width): for j in range(self.width):
bottom_vert_arr[i][j][2] += data[i][j][0] bottom_vert_arr[i][j][2] += data[i][j][0]
if (bottom_vert_arr[i][j][2] < (top_vert_arr[i][0][2])-OFFSET): if (bottom_vert_arr[i][j][2] < (top_vert_arr[i][0][2])-OFFSET):
@ -474,7 +486,10 @@ class fingerprint_app:
return bottom_vert_arr return bottom_vert_arr
def create_stl_mesh(self, faces, vertices): def create_stl_mesh(self, faces, vertices):
'''Create mesh from faces and vertices. '''Create mesh from faces and vertices arrays.
:param faces: Vector of face indices
:param vertices: Vector of vertices
''' '''
# Convert lists to numpy arrays # Convert lists to numpy arrays
@ -500,8 +515,10 @@ class fingerprint_app:
def create_faces(self, top_vert_arr, bottom_vert_arr): def create_faces(self, top_vert_arr, bottom_vert_arr):
'''Create faces for the model. '''Create faces for the model.
Iterate over all vertices, append to vector and create faces from indices.
Iterate over all vertices, append to vector and create faces from indices
:param bottom_vert_arr: Bottom vertex array.
:param top_vert_arr: Top vertex array
''' '''
count = 0 count = 0
@ -563,9 +580,7 @@ class fingerprint_app:
return faces, vertices return faces, vertices
def make_stl_planar(self): def make_stl_planar(self):
''' '''Create vertices from meshgrid, add z coordinates from processed image heightmap.
Create vertices from meshgrid, add depth values from image.
Create faces from vertices. Add vectors and faces to the model.
''' '''
# Add the image matrix to the 2D meshgrid and create 1D array of 3D points # Add the image matrix to the 2D meshgrid and create 1D array of 3D points
@ -589,10 +604,8 @@ class fingerprint_app:
self.create_stl_mesh(faces, vertices) self.create_stl_mesh(faces, vertices)
def make_stl_curved(self): def make_stl_curved(self):
'''Compute curved surface. '''Compute curved surface offset.
Create mesh from meshgrid. Create vertices from meshgrid, add z coordinates from processed image heightmap.
Create vertices from meshgrid, add depth values from image.
Create faces from vertices. Add vectors and faces to the model.
''' '''
# Calculate the curved surface values # Calculate the curved surface values

@ -1,6 +1,7 @@
"""! @file main.py """Utility for parsing STL file header
@brief Utility for parsing STL file header
@author xlanro00 .. moduleauthor:: xlanro00
""" """
# Import basic libraries # Import basic libraries
@ -11,9 +12,8 @@ import log
def stl_parser(): def stl_parser():
""" Main function """Parses stl file header.
Parses stl file header. Prints command for running main.py with preformatted arguments.
Returns command for running main.py with preformatted arguments.
""" """
# Parse arguments # Parse arguments

Loading…
Cancel
Save