You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

320 lines
11 KiB
Python

"""
test register cli
"""
import datetime
import shutil
from enum import Enum
from functools import cached_property
from itertools import product
from pathlib import Path
import attr
import cv2
import numpy as np
import pandas as pd
from loguru import logger
from moviepy.editor import *
from utils import divide_chunks, datenum_to_datetime, nearest, progressbar, RegisteredImage
import time # progress bar
from PIL import Image, ImageFont, ImageDraw
import os
from time import strptime
from dateutil import tz
import openpyxl
import scipy.io as sio
from datetime import datetime, timedelta
'''
SCRIPT LOGIC
For each site in Images Parent Directory:
Iterate through years in reverse:
Iterate through images names (dates) in reverse:
Check if image name in 'Registered'?
If not, tag and save
If yes, skip to the next site
'''
#-----------------------------------------------------------------------------#
# Update this file path for Image Tagging - Tide Data
# Example: parent_dir = '/Users/admin/OneDrive - UNSW/My files/CoastSnap/'
parent_dir_ACTUAL = r"C:\Users\z5079346\OneDrive - UNSW\My files\CoastSnap"
#-----------------------------------------------------------------------------#
# RETRIEVE IMAGES PARENT DIRECTORY IN .csv#
coastsnap_sites = pd.read_csv("C:/Users/z5079346/OneDrive - UNSW/Projects/Coastsnap_test/CoastSnap_Sites.csv")
parent_directory = coastsnap_sites.parent_directory[0]
print(parent_directory)
#-----------------------------------------------------------------------------#
folder = r"C:\Users\z5079346\OneDrive - UNSW\Projects\Coastsnap_test\Images_Test\cathieillaroo\Photoshop\2021"
def get_site_tide_data(parent_dir, site):
# Retrieve tide data for the given site
db = openpyxl.load_workbook(parent_dir + "/Database/CoastSnapDB.xlsx")
beach_data = db[site]
tide_filename = beach_data["B24"].value
if tide_filename == 'NO_TIDE.mat':
return False
mat_path = parent_dir + '/Tide Data/' + tide_filename
mat = sio.loadmat(mat_path)
tide_dict = mat['tide']
ts = tide_dict[0][0] # Format of tide/time Matlab data is gross
tt = list(ts[0]) # ts[0] = tides, ts[1] = times, ts[2] =
print(site + ": " +"Loading tide data... (this may take half a minute)")
tide_times = [datenum_to_datetime(i) for i in tt] # THIS STEP TAKES A LONG TIME
return tide_times, ts
def tag_image(image2tag):
image = Image.open(image2tag.pathname)
draw = ImageDraw.Draw(image)
image2tag.get_dimensions()
# White Text Box
rect_height = image2tag.height/20
# Create white text box
draw.rectangle((0, 0, image2tag.width, rect_height), fill='white')
# Tag image with text
draw.text((20, rect_height/4),image2tag.tag, font = image2tag.font, fill=(0, 0, 0))
registered_path_wrong = image2tag.pathname[:-4] + '_registered.jpg'
registered_path = registered_path_wrong.replace('Photoshop', 'Registered')
image = image.convert('RGB')
image.save(registered_path)
for site in os.listdir(parent_directory): # Loop through SITES
i=0
site_complete = False # A flag to stop tagging images when found
tide_data = False
font = None
photoshop_path = parent_directory +'/'+ site + '/Photoshop'
try: # Check if site contains 'Processed' directory
years_list = os.listdir(photoshop_path)
years_list.reverse()
except:
continue
for year in years_list: # Loop through YEARS
if site_complete: break
year_path = photoshop_path + '/' + year
image_list = os.listdir(year_path)
image_list.reverse()
for image_filename in image_list: # Loop through IMAGES
#print(image_filename)
registered_year_path = year_path.replace('Photoshop', 'Registered')
registered_image_path = registered_year_path + '/' + image_filename[:-4] + '_registered.jpg'
if site not in image_filename:
continue
# Check if image already tagged
if os.path.isfile(registered_image_path):
site_complete = True;
if i == 0:
print(site + ": " + str(i) + " images tagged")
elif image2tag.tide:
print(site + ": " + str(i) + " images tagged with tide")
else:
print(site + ": " + str(i) + " images tagged no tide")
break
else:
if not os.path.exists(registered_year_path): # Chech that registered/year directory exists
os.makedirs(registered_year_path) # if not, create it
i += 1
pathname = os.path.join(year_path, image_filename)
image2tag = RegisteredImage(pathname, image_filename) # Create image object
if i == 1: # Retrieve Tide Data once for each site
site_tide_data, ts = get_site_tide_data(parent_dir_ACTUAL, site)
font = image2tag.get_font()
if site_tide_data:
image2tag.get_tide(site_tide_data, ts)
image2tag.create_tag()
tag_image(image2tag)
"""
Tags images based on file name.
- Requires font file in coastsnap/fonts directory
"""
"""
def tag_images(folder):
photoshop = True
tide = False
# Get image paths
img_paths = [x for x in Path(folder).glob("*.jpg")]
img_names = [str(x) for x in img_paths]
logger.info(f"Tagging {len(img_names)} images")
# Initialise white text box
rect_height = 1
image_width = 1
# Check whether the directory 'tagged' exists or not
path_name = img_names[0]
tagged_dir = str(Path(path_name).parent) + '/tagged'
isExist = os.path.exists(tagged_dir)
if not isExist:
# Create a new directory because it does not exist
os.makedirs(tagged_dir)
# Tide Data
if tide:
# Retrieve the site name from the first image
filename = Path(img_names[0]).name
filename_list = filename.split(".")
site_name = filename_list[6]
# Retrieve tide data for the given site
db = openpyxl.load_workbook(parent_dir + "/Database/CoastSnapDB.xlsx")
beach_data = db[site_name]
tide_filename = beach_data["B24"].value
mat_path = parent_dir + '/Tide Data/' + tide_filename
mat = sio.loadmat(mat_path)
tide_dict = mat['tide']
ts = tide_dict[0][0] # Format of tide/time Matlab data is gross
tt = list(ts[0]) # ts[0] = tides, ts[1] = times, ts[2] =
print("Loading tide data... (this may take half a minute)")
tide_times = [datenum_to_datetime(i) for i in tt] # THIS STEP TAKES A LONG TIME
fontsize = 1
for index, img in enumerate(sorted(img_names)):
print("Image " + str(index+1))
filename = str(Path(img).name)
image = Image.open(img)
draw = ImageDraw.Draw(image)
# Retrieve tag information from file name
filename_list = filename.split(".")
posix_time = filename_list[0]
date = filename_list[3].split("_")
hour = date[1]
minute = date[2]
second = date[3]
day = date[0]
month = '{:02d}'.format(strptime(filename_list[2],'%b').tm_mon) # Ensure 2-digit format
year = filename_list[5]
timezone = filename_list[4]
if 'snap' in filename_list:
contributor = filename_list[8] # Mitch filename format
else:
contributor = filename_list[6] # Leaman filename format
# Retrieve tide data
if tide:
# Account for daylight savings
# ASSUMPTION: All .mat tide files are in AEST.
if timezone == 'AEDT':
hour = str(int(hour) - 1)
date_string = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second
img_datetime = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S") # Image date/time as a datetime object
tide_date = nearest(tide_times, img_datetime)
mat_index = tide_times.index(tide_date) # Retrieve the index of the .mat tide/time
mat_tide = round(ts[1][mat_index][0], 2) # Associated tide
print('Image date/time: ' + date_string)
print('Tide record: ' + str(tide_date))
# Image tag
if tide:
txt = ('Date:' + year + '/' + month + '/' + day +
' Time:' + hour + ':' + minute +
' Contributor:' + contributor +
' Tide:' + str(mat_tide) + 'm AHD')
else:
txt = ('Date:' + year + '/' + month + '/' + day +
' Time:' + hour + ':' + minute +
' Contributor:' + contributor)
# Set the fontsize, such that the tag covers 50% the width of the first image
if index == 0:
img_fraction = 0.8 # Change this to change the font size
# White Text Box
image_width, image_height = image.size
rect_height = image_height/20
rect_width = image_width/1.5
font = ImageFont.truetype("fonts/Courier New Bold.ttf", fontsize)
while font.getsize(txt)[0] < img_fraction*image.size[0]:
# iterate until the text size is just larger than the criteria
fontsize += 1
font = ImageFont.truetype("fonts/Courier New Bold.ttf", fontsize)
font = ImageFont.truetype("fonts/Courier New Bold.ttf", fontsize)
# Create white text box
draw.rectangle((0, 0, image_width, rect_height), fill='white')
# Tag image with text
draw.text((20, rect_height/4),txt, font = font, fill=(0, 0, 0))
new_name = filename + '_registered.jpg'
print(new_name + '\n')
new_path = tagged_dir + "/" + new_name
image = image.convert('RGB')
image.save(new_path)
logger.info(f"Tagged Images for " + + " Saved")
tag_images(folder)
"""
# # Set Image Label Info Based on Target Image (PUT AT LINE 90)
# target_image_path = str(Path(path_name).parent.parent.parent) + r"\Target Image\Target.JPG"
# print(target_image_path)
# image = Image.open(target_image_path)
# img_fraction = 0.6 # Change this to change the font size
# fontsize = 1
# # White Text Box
# width, height = image.size
# rect_height = height/20
# rect_width = width/1.5
# font = ImageFont.truetype("fonts/Courier New Bold.ttf", fontsize)
# while font.getsize(txt)[0] < img_fraction*image.size[0]:
# # iterate until the text size is just larger than the criteria
# fontsize += 1
# font = ImageFont.truetype("fonts/Courier New Bold.ttf", fontsize)
#"C:\Users\z5079346\OneDrive - UNSW\My files\CoastSnap\Images\cathieillaroo\Registered\2022"
#"C:\Users\z5079346\OneDrive - UNSW\My files\CoastSnap\Images\cathieillaroo\Target Image\Target.JPG"