| @@ -0,0 +1,10 @@ | |||
| source_images* | |||
| sources | |||
| output | |||
| playing-around | |||
| __pycache__ | |||
| *.png | |||
| *.R | |||
| *.tif | |||
| *.tiff | |||
| *.jpg | |||
| @@ -0,0 +1,3 @@ | |||
| lxml | |||
| wand | |||
| PyExifTool | |||
| @@ -0,0 +1,110 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | |||
| <svg | |||
| width="6000" | |||
| height="3000" | |||
| viewBox="0 0 6000 3000" | |||
| version="1.1" | |||
| id="svgroot" | |||
| sodipodi:docname="canvas.svg" | |||
| inkscape:version="1.1 (ce6663b3b7, 2021-05-25)" | |||
| enable-background="new" | |||
| xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
| xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
| xmlns:xlink="http://www.w3.org/1999/xlink" | |||
| xmlns="http://www.w3.org/2000/svg" | |||
| xmlns:svg="http://www.w3.org/2000/svg" | |||
| xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
| xmlns:cc="http://creativecommons.org/ns#" | |||
| xmlns:dc="http://purl.org/dc/elements/1.1/"> | |||
| <style> | |||
| .thermal_image { | |||
| opacity: .5 ; | |||
| } | |||
| g.tile[data-direction='down'] { | |||
| opacity: 1; | |||
| } | |||
| <!-- g.tile[data-direction='down'] .tile-offset-corr { | |||
| transform: translate(120px, 0px) | |||
| } --> | |||
| </style> | |||
| <defs id="defs2"> | |||
| <!-- <filter | |||
| xmlns="http://www.w3.org/2000/svg" | |||
| style="color-interpolation-filters:sRGB;" | |||
| inkscape:label="Blur" | |||
| xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
| id="filter156128" | |||
| x="-0.2" y="-0.2" | |||
| width="1.5" | |||
| height="1.5"> | |||
| <feGaussianBlur | |||
| result="blur" | |||
| in="fbSourceGraphic" | |||
| id="feGaussianBlur156190" | |||
| stdDeviation="45 35"/> | |||
| </filter> | |||
| <mask | |||
| maskUnits="userSpaceOnUse" | |||
| id="tilefademask"> | |||
| <rect | |||
| id="rect156378" | |||
| width="640" | |||
| height="512" | |||
| x="-180" | |||
| y="-25" | |||
| style="fill:#ffffff;filter:url(#filter156128)" | |||
| transform="matrix(0.77703373,0,0,0.74018882,207.24036,100.70559)" /> | |||
| </mask> --> | |||
| </defs> | |||
| <sodipodi:namedview | |||
| id="base" | |||
| pagecolor="#ffffff" | |||
| bordercolor="#666666" | |||
| borderopacity="1.0" | |||
| inkscape:pageopacity="0.0" | |||
| inkscape:pageshadow="2" | |||
| inkscape:zoom="0.7" | |||
| inkscape:cx="745" | |||
| inkscape:cy="535" | |||
| inkscape:document-units="px" | |||
| inkscape:current-layer="tiles" | |||
| showgrid="false" | |||
| units="px" | |||
| scale-x="1" | |||
| inkscape:window-width="1920" | |||
| inkscape:window-height="1080" | |||
| inkscape:window-x="0" | |||
| inkscape:window-y="27" | |||
| inkscape:window-maximized="1" | |||
| inkscape:pagecheckerboard="0" /> | |||
| <metadata | |||
| id="metadata5"> | |||
| <rdf:RDF> | |||
| <cc:Work | |||
| rdf:about=""> | |||
| <dc:format>image/svg+xml</dc:format> | |||
| <dc:type | |||
| rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||
| </cc:Work> | |||
| </rdf:RDF> | |||
| </metadata> | |||
| <g | |||
| inkscape:label="tiles" | |||
| inkscape:groupmode="layer" | |||
| id="tiles" | |||
| transform="translate(0,0)" | |||
| style="" /> | |||
| <g | |||
| inkscape:label="tile_rows" | |||
| inkscape:groupmode="layer" | |||
| id="tile_rows" | |||
| transform="translate(0,0)" | |||
| style="" /> | |||
| </svg> | |||
| @@ -0,0 +1,263 @@ | |||
| import os | |||
| import argparse | |||
| import lxml.etree as ET | |||
| import subprocess | |||
| import flirimageextractor | |||
| import cv2 | |||
| import numpy as np | |||
| from pathlib import Path | |||
| from wand.image import Image | |||
| from osgeo import gdal | |||
| from osgeo import osr | |||
| arg_parser = argparse.ArgumentParser(description='Export SVG composition of FLIR images as TIFF with thermo layer') | |||
| arg_parser.add_argument('Input', | |||
| metavar='input_svg', | |||
| type=str, | |||
| help='Path to the input SVG file cotaining xlinks to FLIR images') | |||
| arg_parser.add_argument('Output', | |||
| metavar='output_tiff', | |||
| type=str, | |||
| help='Output filename') | |||
| args = arg_parser.parse_args() | |||
| dirname = os.path.dirname(__file__) | |||
| INPUT_PATH = os.path.join(dirname, args.Input) | |||
| INPUT_DIR = os.path.split(INPUT_PATH)[0] | |||
| TEMP_MAP_THERMALPNG_SVG_PATH = os.path.join(INPUT_DIR, 'map_thermalpng.svg') | |||
| TEMP_MAP_THERMALPNG_PATH = os.path.join(INPUT_DIR, 'map_thermalpng.png') | |||
| TEMP_MAP_PREVIEW_PATH = os.path.join(INPUT_DIR, 'map_preview.png') | |||
| THERMALPNG_DIR = 'thermalpngs' | |||
| OUTPUT_PATH = os.path.join(dirname, args.Output) | |||
| def make_thermalpng_tiles(): | |||
| """ | |||
| Extract thermal infomration as greyscale PNG-16 (temp * 1000 to retain some decimals) | |||
| and save the png tiles | |||
| """ | |||
| Path(os.path.join(INPUT_DIR, THERMALPNG_DIR)).mkdir(parents=True, exist_ok=True) | |||
| png_output_dir = os.path.join(INPUT_DIR, THERMALPNG_DIR) | |||
| for root_path, directories, file in os.walk(os.path.join(dirname, INPUT_DIR)): | |||
| for file in file: | |||
| if(file.endswith(".jpg")): | |||
| print('Extracting thermal info from ' + file) | |||
| full_filepath = os.path.join(root_path, file) | |||
| flir = flirimageextractor.FlirImageExtractor() | |||
| flir.process_image(full_filepath) | |||
| thermal_img_np = flir.thermal_image_np | |||
| multiplied_image = cv2.multiply(thermal_img_np, 1000) | |||
| output_file_path = os.path.join(png_output_dir, file + '.thermal.png') | |||
| print(output_file_path) | |||
| cv2.imwrite(output_file_path, multiplied_image.astype(np.uint16)) | |||
| def make_thermalpng_svg(): | |||
| """ | |||
| replaces the image paths with the thermal pngs | |||
| and creates new SVG file | |||
| """ | |||
| # print("svg_file") | |||
| # print(dir(svg_file)) | |||
| tree = ET.parse(INPUT_PATH) | |||
| root = tree.getroot() | |||
| # print(ET.tostring(root)) | |||
| # tile_rows = root.xpath('//image', namespaces={'n': "http://www.w3.org/2000/svg"}) | |||
| # print(dir(root)) | |||
| tile_elements = root.xpath('//*[@class="thermal_image"]') | |||
| linkattrib ='{http://www.w3.org/1999/xlink}href' | |||
| for tile in tile_elements: | |||
| tile.attrib[linkattrib] = os.path.join(THERMALPNG_DIR, tile.attrib[linkattrib] + '.thermal.png') | |||
| # newxml = ET.tostring(tree, encoding="unicode") | |||
| # print(newxml) | |||
| # return newxml | |||
| with open(TEMP_MAP_THERMALPNG_SVG_PATH, 'wb') as f: | |||
| tree.write(f, encoding='utf-8') | |||
| return tree | |||
| def make_thermalpng(): | |||
| """ | |||
| exports the SVG canvas as Gray_16 PNG | |||
| """ | |||
| command = [ | |||
| '/snap/bin/inkscape', | |||
| '--pipe', | |||
| '--export-type=png', | |||
| '--export-png-color-mode=Gray_16' | |||
| ], | |||
| input_file = open(TEMP_MAP_THERMALPNG_SVG_PATH, "rb") | |||
| output_file = open(TEMP_MAP_THERMALPNG_PATH, "wb") | |||
| completed = subprocess.run( | |||
| *command, | |||
| cwd=INPUT_DIR, # needed for reative image links | |||
| stdin=input_file, | |||
| stdout=output_file | |||
| ) | |||
| return completed | |||
| def make_thermalpreview(): | |||
| """ | |||
| exports the preview image | |||
| """ | |||
| command = [ | |||
| '/snap/bin/inkscape', | |||
| '--pipe', | |||
| '--export-type=png', | |||
| '--export-png-color-mode=Gray_8' | |||
| ], | |||
| input_file = open(TEMP_MAP_THERMALPNG_SVG_PATH, "rb") | |||
| output_file = open(TEMP_MAP_PREVIEW_PATH, "wb") | |||
| completed = subprocess.run( | |||
| *command, | |||
| cwd=INPUT_DIR, # needed for reative image links | |||
| stdin=input_file, | |||
| stdout=output_file | |||
| ) | |||
| return completed | |||
| # def make_thermalpreview(): | |||
| # """ | |||
| # exports the preview image | |||
| # """ | |||
| # command = [ | |||
| # '/snap/bin/inkscape', | |||
| # '--pipe', | |||
| # '--export-type=png', | |||
| # '--export-png-color-mode=Gray_8' | |||
| # ] | |||
| # input_file = open(TEMP_MAP_THERMALPNG_SVG_PATH, "rb") | |||
| # output_file = open(TEMP_MAP_PREVIEW_PATH, "wb") | |||
| # completed = subprocess.run( | |||
| # *command, | |||
| # cwd=INPUT_DIR, # needed for reative image links | |||
| # stdin=input_file, | |||
| # stdout=output_file | |||
| # ) | |||
| # return completed | |||
| def get_thermal_numpy_array(): | |||
| # input_file = open(TEMP_MAP_THERMALPNG_PATH, "rb") | |||
| image = cv2.imread(TEMP_MAP_THERMALPNG_PATH, cv2.IMREAD_ANYDEPTH) | |||
| image_float = image.astype(np.float32) | |||
| image_float_normalized = cv2.divide(image_float, 1000) | |||
| print(image_float_normalized[1000][905]) | |||
| # cv2.imshow("OpenCV Image Reading", image) | |||
| return image_float_normalized | |||
| def get_used_tiles_relpaths(): | |||
| """ | |||
| outputs an array of all used tile filenames in the input SVG | |||
| (relative filepaths like they appear in the svg.) | |||
| """ | |||
| images = [] | |||
| tree = ET.parse(INPUT_PATH) | |||
| root = tree.getroot() | |||
| tile_elements = root.xpath('//*[@class="thermal_image"]') | |||
| linkattrib ='{http://www.w3.org/1999/xlink}href' | |||
| for tile in tile_elements: | |||
| images.append(tile.attrib[linkattrib]) | |||
| return images | |||
| def deg_coordinates_to_decimal(coordStr): | |||
| coordArr = coordStr.split(', ') | |||
| calculatedCoordArray = [] | |||
| for calculation in coordArr: | |||
| calculationArr = calculation.split('/') | |||
| calculatedCoordArray.append(int(calculationArr[0]) / int(calculationArr[1])) | |||
| degrees = calculatedCoordArray[0] | |||
| minutes = calculatedCoordArray[1] | |||
| seconds = calculatedCoordArray[2] | |||
| decimal = (degrees + (minutes * 1/60) + (seconds * 1/60 * 1/60)) | |||
| # print(decimal) | |||
| return decimal | |||
| def read_coordinates_from_tile(filename): | |||
| full_filepath = os.path.join(INPUT_DIR, filename) | |||
| with Image(filename=full_filepath) as image: | |||
| for key, value in image.metadata.items(): | |||
| if key == 'exif:GPSLatitude': | |||
| # print('latstr', value) | |||
| lat = deg_coordinates_to_decimal(value) # lat -> Y vertical | |||
| if key == 'exif:GPSLongitude': | |||
| # print('lonstr', value) | |||
| lon = deg_coordinates_to_decimal(value) # lon -> X horizontal | |||
| if key == 'exif:GPSImgDirection': | |||
| direction = value.split('/') | |||
| print(int(direction[0])/int(direction[1])/2, ' ', (value)) | |||
| return [lat, lon] | |||
| def get_coordinate_boundaries(): | |||
| image_names = get_used_tiles_relpaths() | |||
| coordinates = { | |||
| 'lat': [], | |||
| 'lon': [] | |||
| } | |||
| for filename in image_names: | |||
| tile_coordinates = read_coordinates_from_tile(filename) | |||
| coordinates['lat'].append(tile_coordinates[0]) | |||
| coordinates['lon'].append(tile_coordinates[1]) | |||
| boundaries = { | |||
| 'xmin': min(coordinates['lon']), | |||
| 'xmax': max(coordinates['lon']), | |||
| 'ymin': min(coordinates['lat']), | |||
| 'ymax': max(coordinates['lat']), | |||
| } | |||
| return boundaries | |||
| def make_geotiff_image(): | |||
| thermal_numpy_array = get_thermal_numpy_array() | |||
| # coordinates of all tiles | |||
| geo_bound = get_coordinate_boundaries() | |||
| print('boundaries', geo_bound) | |||
| np_shape = thermal_numpy_array.shape | |||
| image_size = (np_shape[0], np_shape[1]) | |||
| # set geotransform | |||
| nx = image_size[0] | |||
| ny = image_size[1] | |||
| xres = (geo_bound['xmax'] - geo_bound['xmin']) / float(nx) | |||
| yres = (geo_bound['ymax'] - geo_bound['ymin']) / float(ny) | |||
| geotransform = (geo_bound['xmin'], xres, 0, geo_bound['ymax'], 0, -yres) | |||
| # create the 3-band raster file | |||
| dst_ds = gdal.GetDriverByName('GTiff').Create(OUTPUT_PATH, ny, nx, 1, gdal.GDT_Float32) | |||
| dst_ds.SetGeoTransform(geotransform) # specify coords | |||
| srs = osr.SpatialReference() # establish encoding | |||
| res = srs.SetWellKnownGeogCS( "WGS84" ) # WGS84 lat/long | |||
| dst_ds.SetProjection(srs.ExportToWkt()) # export coords to file | |||
| dst_ds.GetRasterBand(1).WriteArray(thermal_numpy_array) # write thermal-band to the raster | |||
| dst_ds.FlushCache() # write to disk | |||
| # make_thermalpng_tiles() | |||
| # make_thermalpng_svg() | |||
| # make_thermalpreview() | |||
| # make_thermalpng() | |||
| make_geotiff_image() | |||
| # dataset = gdal.Open("working_result_example.tif", gdal.GA_ReadOnly) | |||
| # print(dir(dataset)) | |||
| # print(dataset.GetMetadata_List()) | |||
| @@ -0,0 +1,238 @@ | |||
| from wand.image import Image | |||
| import PIL.Image | |||
| import io | |||
| import exiftool | |||
| import subprocess | |||
| import os | |||
| import lxml.etree as ET | |||
| import copy | |||
| import cv2 | |||
| import flirimageextractor | |||
| from matplotlib import cm | |||
| import numpy as np | |||
| import urllib.request | |||
| dirname = os.path.dirname(__file__) | |||
| working_dir = 'source_images_full' | |||
| filename = os.path.join(dirname, 'canvas.svg') | |||
| tree = ET.parse(filename) | |||
| root = tree.getroot() | |||
| d = root.nsmap | |||
| main_layer = root.xpath('//*[@id="tiles"]', namespaces={'n': "http://www.w3.org/2000/svg"})[0] | |||
| tile_rows = root.xpath('//*[@id="tile_rows"]', namespaces={'n': "http://www.w3.org/2000/svg"})[0] | |||
| def deg_coordinates_to_decimal(coordStr): | |||
| coordArr = value.split(', ') | |||
| calculatedCoordArray = [] | |||
| for calculation in coordArr: | |||
| calculationArr = calculation.split('/') | |||
| calculatedCoordArray.append(int(calculationArr[0]) / int(calculationArr[1])) | |||
| degrees = calculatedCoordArray[0] | |||
| minutes = calculatedCoordArray[1] | |||
| seconds = calculatedCoordArray[2] | |||
| return (degrees + (minutes * 1/60) + (seconds * 1/60 * 1/60)) | |||
| # # extracting TIF Data | |||
| # for root, directories, file in os.walk(os.path.join(dirname, working_dir)): | |||
| # for file in file: | |||
| # if(file.endswith(".jpg")): | |||
| # print(os.path.join(root, file)) | |||
| # full_filepath = os.path.join(root, file) | |||
| # with exiftool.ExifTool() as et: | |||
| # cmd = ['exiftool', full_filepath, "-b", "-RawThermalImage"] | |||
| # tif_data = subprocess.check_output(cmd) | |||
| # tif_image = PIL.Image.open(io.BytesIO(tif_data)) | |||
| # tif_filepath = os.path.join(dirname, working_dir, file.split('.')[0] + '_thermal.tif') | |||
| # tif_image.save(tif_filepath) | |||
| # print(tif_filepath) | |||
| # finding the boundaries of the whole canvas | |||
| latsArr = [] | |||
| lonsArr = [] | |||
| for root_path, directories, file in os.walk(os.path.join(dirname, working_dir)): | |||
| for file in file: | |||
| if(file.endswith(".jpg")): | |||
| print(os.path.join(root_path, file)) | |||
| full_filepath = os.path.join(root_path, file) | |||
| with Image(filename=full_filepath) as image: | |||
| print(image.width) | |||
| print(image.height) | |||
| for key, value in image.metadata.items(): | |||
| if key == 'exif:GPSLatitude': | |||
| lat = deg_coordinates_to_decimal(value) # lat -> Y vertical | |||
| latsArr.append(lat) | |||
| print("{}: {}".format(key, value)) | |||
| print('lat '+ str(lat)) | |||
| if key == 'exif:GPSLongitude': | |||
| lon = deg_coordinates_to_decimal(value) # lon -> X horizontal | |||
| lonsArr.append(lon) | |||
| print("{}: {}".format(key, value)) | |||
| print('lon '+ str(lon)) | |||
| minLat = min(latsArr) | |||
| minLon = min(lonsArr) | |||
| maxLat = max(latsArr) | |||
| maxLon = max(lonsArr) | |||
| width = maxLon - minLon | |||
| height = maxLat- minLat | |||
| # placing the images into the svg | |||
| rotation = 125 | |||
| y_scale = -1800000 #-400000 | |||
| x_scale = 655000 #-950000 | |||
| # y_scale = 2600000 #-400000 | |||
| # x_scale = 1200000 #-950000 | |||
| image_rotation_up = rotation #32 | |||
| image_rotation_down = rotation + 180 #192 | |||
| for root_path, directories, file in os.walk(os.path.join(dirname, working_dir)): | |||
| for file in file: | |||
| if(file.endswith(".jpg")): | |||
| print(os.path.join(root_path, file)) | |||
| full_filepath = os.path.join(root_path, file) | |||
| with Image(filename=full_filepath) as image: | |||
| print(image.width) | |||
| print(image.height) | |||
| for key, value in image.metadata.items(): | |||
| # print("{}: {}".format(key, value)) | |||
| if key == 'exif:GPSLatitude': | |||
| lat = deg_coordinates_to_decimal(value) - minLat | |||
| print('lat '+ str(lat)) | |||
| if key == 'exif:GPSLongitude': | |||
| lon = deg_coordinates_to_decimal(value) - minLon | |||
| print('lon '+ str(lon)) | |||
| if key == 'exif:GPSImgDirection': | |||
| direction = value.split('/') | |||
| rotation = int(direction[0])/int(direction[1])/2 | |||
| g_pos_el_attributes = { | |||
| # 'x': str(lat*scale), | |||
| # 'y': str(lon*scale), | |||
| 'transform': "translate({}, {})".format(format(lon*x_scale, '.20f'), format(lat*y_scale, '.20f')), | |||
| 'data-lat': format(lat, '.20f'), | |||
| 'data-lon': format(lon, '.20f'), | |||
| 'class': 'tile', | |||
| 'id': 'tile_{}'.format(file.split('.')[0]), | |||
| # 'style': 'opacity:.6', | |||
| } | |||
| g_pos_el = ET.SubElement(main_layer, 'g', attrib=g_pos_el_attributes) | |||
| g_offset_corr_el_attributes = { | |||
| 'transform': "translate(150, 0)", | |||
| 'class': 'tile-offset-corr', | |||
| } | |||
| g_offset_corr_el = ET.SubElement(g_pos_el, 'g', attrib=g_offset_corr_el_attributes) | |||
| g_center_el_attributes = { | |||
| 'class': 'tile-center', | |||
| 'transform': 'translate({}, {})'.format(str(image.width/2*-1), str(image.height/2*-1)) | |||
| } | |||
| g_center_el = ET.SubElement(g_offset_corr_el, 'g', attrib=g_center_el_attributes) | |||
| g_rot_el_attributes = { | |||
| 'class': 'tile-rotate', | |||
| 'data-image-rotation': str(image_rotation_up), | |||
| 'data-image-dimensions': str(image.width/2) + ' ' + str(image.height/2), | |||
| 'transform': 'rotate({} {} {})'.format(str(image_rotation_up), str(image.width/2), str(image.height/2)) | |||
| } | |||
| g_rot_el = ET.SubElement(g_center_el, 'g', attrib=g_rot_el_attributes) | |||
| xlinkns ="http://www.w3.org/1999/xlink" | |||
| image_el = ET.SubElement(g_rot_el, 'image', { | |||
| "class": 'thermal_image', | |||
| "{%s}href" % xlinkns: file, | |||
| "width": str(image.width), | |||
| "height": str(image.height), | |||
| "mask" : "url(#tilefademask)", | |||
| }) | |||
| # transform_str = "translate(-{}, -{})".format(str(min(latsArr)*scale), str(min(lonsArr)*scale)) | |||
| # print(transform_str) | |||
| # main_layer.attrib['transform'] = transform_str | |||
| # sort elements | |||
| def getkey(elem): | |||
| # Used for sorting elements by @LIN. | |||
| # returns a tuple of ints from the exploded @LIN value | |||
| # '1.0' -> (1,0) | |||
| # '1.0.1' -> (1,0,1) | |||
| return float(elem.get('id').split('_')[2]) | |||
| main_layer[:] = sorted(main_layer, key=getkey) | |||
| # rotate image if previous element is under the current one | |||
| last_state = 'down' | |||
| for index, el in enumerate(main_layer): | |||
| if(el.getprevious() is not None): | |||
| if (el.getprevious().attrib['data-lon'] > el.attrib['data-lon'] or (el.getprevious().attrib['data-lon'] == el.attrib['data-lon'] and last_state == 'up')): | |||
| print('up') | |||
| rot_el = el[0][0][0] | |||
| # print(rot_el.attrib['data-image-rotation']) | |||
| # print(rot_el.attrib['data-image-dimensions']) | |||
| el.attrib['data-direction'] = 'up' | |||
| # print(el.attrib['data-lat'], el.getprevious().attrib['data-lat']) | |||
| else: | |||
| rot_el = el[0][0][0] | |||
| el.attrib['data-direction'] = 'down' | |||
| # el.attrib['style'] = 'opacity:0' | |||
| new_rotation = image_rotation_down #float(rot_el.attrib['data-image-rotation']) + 180 | |||
| rot_el.attrib['transform'] = "rotate({} {})".format(str(new_rotation), rot_el.attrib['data-image-dimensions']) | |||
| print('down') | |||
| # print(rot_el.attrib['data-image-rotation']) | |||
| # print(rot_el.attrib['data-image-dimensions']) | |||
| # merge tiles into groups | |||
| print(index) | |||
| print("el.attrib['data-direction'] " + el.attrib['data-direction']) | |||
| print("last_state " + last_state) | |||
| if index is 1 or last_state != el.attrib['data-direction']: | |||
| current_row = ET.SubElement(tile_rows, 'g', attrib={ 'class': 'tile-row' }) | |||
| copyElem = copy.deepcopy(el) | |||
| current_row.insert(0, copyElem) | |||
| last_state = el.attrib['data-direction'] | |||
| root.remove(main_layer) | |||
| with open(os.path.join(working_dir,'map.svg'), 'wb') as f: | |||
| tree.write(f, encoding='utf-8') | |||
| # # get some base satellite map for reference | |||
| # apikey = "MYaMHCLtPz1fUfe0FzZqOMI35m893jIV80oeHG19Piw" | |||
| # lon_center = | |||
| # lat_center = | |||
| # zoom = | |||
| # map_width = | |||
| # request = "https://image.maps.ls.hereapi.com/mia/1.6/mapview?apiKey={}&c={},{}&sb=mk&t=1&z={}&w={}&nodot".format(apikey, lon_center, lat_center, zoom, map_width) | |||
| # svg = ET.tostring(tree, encoding="unicode") | |||
| # print(svg) | |||
| print('Done!') | |||
| @@ -0,0 +1,197 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | |||
| <svg | |||
| width="1920" | |||
| height="1080" | |||
| viewBox="0 0 1920 1080" | |||
| version="1.1" | |||
| id="svg8" | |||
| sodipodi:docname="mask.svg" | |||
| inkscape:version="1.1 (ce6663b3b7, 2021-05-25)" | |||
| enable-background="new" | |||
| xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
| xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
| xmlns:xlink="http://www.w3.org/1999/xlink" | |||
| xmlns="http://www.w3.org/2000/svg" | |||
| xmlns:svg="http://www.w3.org/2000/svg" | |||
| xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
| xmlns:cc="http://creativecommons.org/ns#" | |||
| xmlns:dc="http://purl.org/dc/elements/1.1/"> | |||
| <style | |||
| id="style212248"> | |||
| #image156515 { | |||
| fill:#f00; | |||
| } | |||
| </style> | |||
| <defs | |||
| id="defs2"> | |||
| <filter | |||
| style="color-interpolation-filters:sRGB;" | |||
| inkscape:label="Blur" | |||
| id="filter156128" | |||
| x="-0.225" | |||
| y="-0.28125" | |||
| width="1.45" | |||
| height="1.5625"> | |||
| <feGaussianBlur | |||
| stdDeviation="20 20" | |||
| result="fbSourceGraphic" | |||
| id="feGaussianBlur156126" /> | |||
| <feColorMatrix | |||
| result="fbSourceGraphicAlpha" | |||
| in="fbSourceGraphic" | |||
| values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0" | |||
| id="feColorMatrix156166" /> | |||
| <feGaussianBlur | |||
| id="feGaussianBlur156168" | |||
| stdDeviation="20 20" | |||
| result="fbSourceGraphic" | |||
| in="fbSourceGraphic" /> | |||
| <feColorMatrix | |||
| result="fbSourceGraphicAlpha" | |||
| in="fbSourceGraphic" | |||
| values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0" | |||
| id="feColorMatrix156188" /> | |||
| <feGaussianBlur | |||
| id="feGaussianBlur156190" | |||
| stdDeviation="20 20" | |||
| result="blur" | |||
| in="fbSourceGraphic" /> | |||
| </filter> | |||
| <mask | |||
| maskUnits="userSpaceOnUse" | |||
| id="mask156376"> | |||
| <rect | |||
| id="rect156378" | |||
| width="640" | |||
| height="512" | |||
| x="762.2807" | |||
| y="227.90842" | |||
| style="fill:#ffffff;filter:url(#filter156128)" | |||
| transform="matrix(0.77703373,0,0,0.74018882,207.24036,100.70559)" /> | |||
| </mask> | |||
| </defs> | |||
| <sodipodi:namedview | |||
| id="base" | |||
| pagecolor="#ffffff" | |||
| bordercolor="#666666" | |||
| borderopacity="1.0" | |||
| inkscape:pageopacity="0.0" | |||
| inkscape:pageshadow="2" | |||
| inkscape:zoom="0.28748238" | |||
| inkscape:cx="1087.0231" | |||
| inkscape:cy="-401.76375" | |||
| inkscape:document-units="px" | |||
| inkscape:current-layer="layer1" | |||
| showgrid="false" | |||
| units="px" | |||
| scale-x="1" | |||
| inkscape:window-width="1920" | |||
| inkscape:window-height="1016" | |||
| inkscape:window-x="0" | |||
| inkscape:window-y="27" | |||
| inkscape:window-maximized="1" | |||
| inkscape:pagecheckerboard="0" /> | |||
| <metadata | |||
| id="metadata5"> | |||
| <rdf:RDF> | |||
| <cc:Work | |||
| rdf:about=""> | |||
| <dc:format>image/svg+xml</dc:format> | |||
| <dc:type | |||
| rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||
| <dc:title /> | |||
| </cc:Work> | |||
| </rdf:RDF> | |||
| </metadata> | |||
| <g | |||
| inkscape:label="Layer 1" | |||
| inkscape:groupmode="layer" | |||
| id="layer1" | |||
| transform="translate(0,-11.249983)" | |||
| style=""> | |||
| <g | |||
| id="g155860" | |||
| transform="translate(-728.00885,-195.75467)" | |||
| mask="url(#mask156376)"> | |||
| <image | |||
| width="640" | |||
| height="512" | |||
| preserveAspectRatio="none" | |||
| xlink:href="source_images_full/20200621_125946_R.jpg" | |||
| id="image155751" | |||
| x="728.00885" | |||
| y="207.00465" /> | |||
| </g> | |||
| <image | |||
| width="640" | |||
| height="512" | |||
| preserveAspectRatio="none" | |||
| xlink:href="source_images_full/20200621_125920_R.jpg" | |||
| id="image156515" | |||
| x="780" | |||
| y="-80.464302" | |||
| style="" /> | |||
| <image | |||
| width="640" | |||
| height="512" | |||
| preserveAspectRatio="none" | |||
| xlink:href="source_images_full/20200621_125921_R.jpg" | |||
| id="image156527" | |||
| x="1368.5714" | |||
| y="616.67853" /> | |||
| <image | |||
| width="640" | |||
| height="512" | |||
| preserveAspectRatio="none" | |||
| xlink:href="source_images_full/20200621_125922_R.jpg" | |||
| id="image156539" | |||
| x="1751.8823" | |||
| y="-283.38199" /> | |||
| <image | |||
| width="640" | |||
| height="512" | |||
| preserveAspectRatio="none" | |||
| xlink:href="source_images_full/20200621_125924_R.jpg" | |||
| id="image156563" | |||
| x="1785.2552" | |||
| y="-97.210777" /> | |||
| <image | |||
| width="640" | |||
| height="512" | |||
| preserveAspectRatio="none" | |||
| xlink:href="source_images_full/20200621_125923_R.jpg" | |||
| id="image156551" | |||
| x="1772.9646" | |||
| y="-189.51526" /> | |||
| <image | |||
| width="640" | |||
| height="512" | |||
| preserveAspectRatio="none" | |||
| xlink:href="source_images_full/20200621_125925_R.jpg" | |||
| id="image156575" | |||
| x="1800.0695" | |||
| y="1.4803357" /> | |||
| <image | |||
| width="640" | |||
| height="512" | |||
| preserveAspectRatio="none" | |||
| xlink:href="source_images_full/20200621_125926_R.jpg" | |||
| id="image156587" | |||
| x="1810.1398" | |||
| y="115.43749" /> | |||
| <image | |||
| width="640" | |||
| height="512" | |||
| preserveAspectRatio="none" | |||
| xlink:href="source_images_full/20200621_125927_R.jpg" | |||
| id="image156599" | |||
| x="1830.4902" | |||
| y="197.49077" /> | |||
| <path | |||
| style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | |||
| d="m 2391.8823,-283.38199 78.6079,480.87276" | |||
| id="path156735" /> | |||
| </g> | |||
| </svg> | |||
| @@ -0,0 +1,43 @@ | |||
| import cv2 | |||
| # import flirimageextractor | |||
| # flir = flirimageextractor.FlirImageExtractor() | |||
| # flir.process_image('source_images_full/20200621_125936_R.jpg',RGB=True) | |||
| # c = flir.get_metadata('source_images_full/20200621_125936_R.jpg') | |||
| # img = flir.extract_embedded_image() | |||
| import flirimageextractor | |||
| from matplotlib import cm | |||
| import numpy as np | |||
| # flir = flirimageextractor.FlirImageExtractor() | |||
| # flir.process_image('source_images_full/20200621_125936_R.jpg') | |||
| # flir.save_images() | |||
| # flir.plot() | |||
| flir = flirimageextractor.FlirImageExtractor() | |||
| flir.process_image('source_images_full/20200621_125936_R.jpg') | |||
| # img = flir.save_images() #min=0,max=64, | |||
| # print(dir(img)) | |||
| # print(img) | |||
| thermal_img_np = flir.thermal_image_np | |||
| h,w = thermal_img_np.shape | |||
| # print(flir.flir_img_bytes()) | |||
| print(thermal_img_np) | |||
| print(type(thermal_img_np[0][0])) | |||
| print(h) | |||
| print(w) | |||
| # cv2.imdecode(thermal_img_np) | |||
| multiplied_image = cv2.multiply(thermal_img_np, 1000) | |||
| cv2.imwrite('color_img.png', multiplied_image.astype(np.uint16)) | |||
| # img.astype('uint8') | |||
| # image = cv2.imdecode(thermal_img_np,4) | |||
| # print('Image Dimensions :', image.shape) | |||