Skip to content

Commit

Permalink
Pretty image title (#610)
Browse files Browse the repository at this point in the history
* Consistency with `title` parameter.
* No default title if nothing passed (making a title is very slow on a raspberry pi)
  • Loading branch information
wtgee authored Sep 21, 2018
1 parent 59344a5 commit ae51586
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 39 deletions.
15 changes: 11 additions & 4 deletions pocs/camera/camera.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,8 @@ def take_observation(self, observation, headers=None, filename=None, *args, **kw
observation.exposure_list[image_id] = file_path

# Process the exposure once readout is complete
t = Thread(target=self.process_exposure, args=(metadata, observation_event, exposure_event))
t = Thread(target=self.process_exposure, args=(
metadata, observation_event, exposure_event))
t.name = '{}Thread'.format(self.name)
t.start()

Expand Down Expand Up @@ -238,12 +239,18 @@ def process_exposure(self, info, observation_event, exposure_event=None):
image_id = info['image_id']
seq_id = info['sequence_id']
file_path = info['file_path']
self.logger.debug("Processing {}".format(image_id))
exptime = info['exp_time']
field_name = info['field_name']

image_title = '{} [{}] {} {}'.format(field_name,
exptime,
seq_id.replace('_', ' '),
current_time(pretty=True))

try:
self.logger.debug("Extracting pretty image")
self.logger.debug("Processing {}".format(image_title))
img_utils.make_pretty_image(file_path,
title=info['field_name'],
title=image_title,
link_latest=info['is_primary'])
except Exception as e:
self.logger.warning('Problem with extracting pretty image: {}'.format(e))
Expand Down
74 changes: 46 additions & 28 deletions pocs/utils/images/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

from glob import glob
from copy import copy
from dateutil import parser as date_parser

from pocs.utils import current_time
from pocs.utils import error
Expand Down Expand Up @@ -64,30 +65,32 @@ def crop_data(data, box_width=200, center=None, verbose=False):
return center


def make_pretty_image(fname, timeout=15, link_latest=False, **kwargs): # pragma: no cover
"""Make a pretty image
def make_pretty_image(fname, title=None, timeout=15, link_latest=False, **kwargs): # pragma: no cover
"""Make a pretty image.
This will create a jpg file from either a CR2 (Canon) or FITS file.
Notes:
See `$POCS/scripts/cr2_to_jpg.sh` for CR2 process.
Arguments:
fname (str): Name of image file, may be either .fits or .cr2.
timeout (int, optional): Timeout for image conversion in seconds,
default 15 seconds.
fname {str} -- Name of image file, may be either .fits or .cr2
title (None|str, optional): Title to be placed on image, default None.
timeout (int, optional): Timeout for conversion, default 15 seconds.
link_latest (bool, optional): If the pretty picture should be linked to
`$PANDIR/images/latest.jpg`, default False.
**kwargs: Additional keyword arguments passed to the conversion methods.
**kwargs {dict} -- Additional arguments to be passed to external script.
Returns:
str -- Filename of image that was created
str -- Filename of image that was created.
"""
assert os.path.exists(fname),\
warn("File doesn't exist, can't make pretty: {}".format(fname))

if fname.endswith('.cr2'):
pretty_path = _make_pretty_from_cr2(fname, timeout=timeout, **kwargs)
pretty_path = _make_pretty_from_cr2(fname, title=title, timeout=timeout, **kwargs)
elif fname.endswith('.fits'):
pretty_path = _make_pretty_from_fits(fname, **kwargs)
pretty_path = _make_pretty_from_fits(fname, title=title, **kwargs)
else:
warn("File must be a Canon CR2 or FITS file.")
return None
Expand All @@ -110,25 +113,42 @@ def make_pretty_image(fname, timeout=15, link_latest=False, **kwargs): # pragma
return pretty_path


def _make_pretty_from_fits(
fname=None, figsize=(10, 10 / 1.325), dpi=150, alpha=0.2, number=7, **kwargs):
def _make_pretty_from_fits(fname=None,
title=None,
figsize=(10, 10 / 1.325),
dpi=150,
alpha=0.2,
number_ticks=7,
clip_percent=99.9,
**kwargs):

with open_fits(fname) as hdu:
header = hdu[0].header
data = hdu[0].data
data = focus_utils.mask_saturated(data)
wcs = WCS(header)

title = kwargs.get('title', header.get('FIELD', 'Unknown'))
exp_time = header.get('EXPTIME', 'Unknown')
if not title:
field = header.get('FIELD', 'Unknown field')
exp_time = header.get('EXPTIME', 'Unknown exptime')
filter_type = header.get('FILTER', 'Unknown filter')

try:
date_time = header['DATE-OBS']
except KeyError:
# If we don't have DATE-OBS, check filename for date
try:
basename = os.path.splitext(os.path.basename(fname))[0]
date_time = date_parser.parse(basename).isoformat()
except Exception:
# Otherwise use now
date_time = current_time(pretty=True)

filter_type = header.get('FILTER', 'Unknown filter')
date_time = header.get('DATE-OBS', current_time(pretty=True)).replace('T', ' ', 1)
date_time = date_time.replace('T', ' ', 1)

percent_value = kwargs.get('normalize_clip_percent', 99.9)
title = '{} ({}s {}) {}'.format(field, exp_time, filter_type, date_time)

title = '{} ({}s {}) {}'.format(title, exp_time, filter_type, date_time)
norm = ImageNormalize(interval=PercentileInterval(percent_value), stretch=LogStretch())
norm = ImageNormalize(interval=PercentileInterval(clip_percent), stretch=LogStretch())

fig = plt.figure(figsize=figsize, dpi=dpi)

Expand All @@ -140,7 +160,7 @@ def _make_pretty_from_fits(
ra_axis.set_axislabel('Right Ascension')
ra_axis.set_major_formatter('hh:mm')
ra_axis.set_ticks(
number=number,
number=number_ticks,
color='white',
exclude_overlapping=True
)
Expand All @@ -149,7 +169,7 @@ def _make_pretty_from_fits(
dec_axis.set_axislabel('Declination')
dec_axis.set_major_formatter('dd:mm')
dec_axis.set_ticks(
number=number,
number=number_ticks,
color='white',
exclude_overlapping=True
)
Expand All @@ -171,16 +191,14 @@ def _make_pretty_from_fits(
return new_filename


def _make_pretty_from_cr2(fname, timeout=15, **kwargs): # pragma: no cover
def _make_pretty_from_cr2(fname, title=None, timeout=15, **kwargs): # pragma: no cover
verbose = kwargs.get('verbose', False)

title = '{} {}'.format(kwargs.get('title', ''), current_time().isot)

solve_field = "{}/scripts/cr2_to_jpg.sh".format(os.getenv('POCS'))
cmd = [solve_field, fname, title]
script_name = os.path.join(os.getenv('POCS'), 'scripts', 'cr2_to_jpg.sh')
cmd = [script_name, fname]

if kwargs.get('primary', False):
cmd.append('link')
if title:
cmd.append(title)

if verbose:
print(cmd)
Expand Down
14 changes: 7 additions & 7 deletions scripts/cr2_to_jpg.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ usage() {
# If exiftool is present this merely extracts the thumbnail from
# the CR2 file, otherwise use dcraw to create a jpeg.
#
# If present the CAPTION is added as a caption to the jpeg.
# If present the TITLE is added as a title to the jpeg.
##################################################
$ $(basename $0) FILENAME [CAPTION]
$ $(basename $0) FILENAME [TITLE]
Options:
FILENAME Name of CR2 file that holds jpeg.
CAPTION Optional caption to be placed on jpeg.
TITLE Optional tilte to be placed on jpeg.
Example:
scripts/cr2_to_jpg.sh /var/panoptes/images/temp.cr2 \"M42 (Orion's Nebula)\"
Expand All @@ -26,7 +26,7 @@ if [ $# -eq 0 ]; then
fi

FNAME=$1
CAPTION="${2}"
TITLE="${2}"

JPG="${FNAME%.cr2}.jpg"

Expand All @@ -45,12 +45,12 @@ else
fi
fi

if [[ -n "$CAPTION" ]]
if [[ -n "$TITLE" ]]
then
echo "Adding caption \"${CAPTION}\""
echo "Adding title \"${TITLE}\""
# Make thumbnail from jpg.
convert "${JPG}" -background black -fill red \
-font ubuntu -pointsize 60 label:"${CAPTION}" \
-font ubuntu -pointsize 60 label:"${TITLE}" \
-gravity South -append "${JPG}"
fi

Expand Down

0 comments on commit ae51586

Please sign in to comment.