Source code for sensors.GUIclasses.camera_settings_widget
from bokeh.models import AutocompleteInput
from bokeh.models import Button, Select, Slider, NumericInput, TextInput, RadioButtonGroup
from bokeh.events import ButtonClick
from bokeh.layouts import row, column
[docs]class CameraSettings:
"""Class to create a Bokeh widget to change Picamera settings, including analog gain, digital gain, \
automatic white balance (awb) for red and blue channels, sharpness, contrast and video denoise.
:param config: configuration including presettings for Picamera and current Bokeh document
:type config: object
"""
def __init__(self, config):
self.config = config
self.curdoc = config.curdoc
self._widget = self.make_widget()
@property
def widget(self):
"""Calls method :meth:`make_widget`.
"""
return self._widget
[docs] def make_widget(self):
""" Creates the Picamera settings widget, including sliders and numeric inputs to change camera parameters.
:return: Bokeh widget for Picamera settings
:rtype: Bokeh object
"""
MARGIN = (10, 0, 0, 5)
WIDTH_INPUT = 50
WIDTH_SLIDER = 133
self.btn_show_settings = Button(label='Show Camera Settings', width=310)
self.btn_show_settings.on_event(ButtonClick, self.show_settings)
# define sliders, numeric inputs and select widget for RGB values of LED stripe - jslink corresponding inputs
self.shutter_speed_Input = NumericInput(width=WIDTH_INPUT, value=self.config.exposure_time, low=1000,
high=int(1/self.config.camera_fps*1000000),
mode='int', css_classes=["custom-input"])
self.shutter_speed = Slider(start=1000, end=int(1/self.config.camera_fps*1000000),
value=self.shutter_speed_Input.value, step=1000,
bar_color='#eaeaea', css_classes=["custom-slider1"], default_size=WIDTH_SLIDER,
show_value=False, margin=MARGIN)
self.analog_gain_Input = NumericInput(width=WIDTH_INPUT, value=self.config.analog_gain, low=0,
high=8, mode='float')
self.analog_gain = Slider(start=0, end=8, value=self.analog_gain_Input.value, step=0.1,
bar_color='#eaeaea', css_classes=["custom-slider1"], default_size=WIDTH_SLIDER,
show_value=False, margin=MARGIN)
self.digital_gain_Input = NumericInput(width=WIDTH_INPUT, value=self.config.digital_gain,
low=0, high=8, mode='float')
self.digital_gain = Slider(start=0, end=8, value=self.digital_gain_Input.value, step=0.1,
bar_color='#eaeaea', css_classes=["custom-slider1"], default_size=WIDTH_SLIDER,
show_value=False, margin=MARGIN)
self.white_balance_Input_1 = NumericInput(width=WIDTH_INPUT, value=self.config.white_balance[0],
low=0, high=8, mode='float')
self.white_balance_1 = Slider(start=0, end=8, value=self.white_balance_Input_1.value, step=0.05,
default_size=WIDTH_SLIDER, bar_color='#eaeaea', css_classes=["custom-slider1"],
show_value=False, margin=MARGIN)
self.white_balance_Input_2 = NumericInput(width=WIDTH_INPUT, value=self.config.white_balance[1],
low=0, high=8, mode='float')
self.white_balance_2 = Slider(start=0, end=8, value=self.white_balance_Input_2.value, step=0.05,
default_size=WIDTH_SLIDER, bar_color='#eaeaea', css_classes=["custom-slider1"],
show_value=False, margin=MARGIN)
self.sharpness_Input = NumericInput(width=WIDTH_INPUT, value=0,
low=-100, high=100, mode='int')
self.sharpness = Slider(start=-100, end=100, value=self.sharpness_Input.value, step=1,
default_size=WIDTH_SLIDER, bar_color='#eaeaea', css_classes=["custom-slider1"],
show_value=False, margin=MARGIN)
self.contrast_Input = NumericInput(width=WIDTH_INPUT, value=0,
low=-100, high=100, mode='int')
self.contrast = Slider(start=-100, end=100, value=self.contrast_Input.value, step=1,
default_size=WIDTH_SLIDER, bar_color='#eaeaea',
css_classes=["custom-slider1"], show_value=False, margin=MARGIN)
self.video_denoise = RadioButtonGroup(labels=['ON', 'OFF'], active=0, default_size=108, height=31)
WIDTH_TEXTS = 107
shutter_speed_Text = TextInput(width=WIDTH_TEXTS, value='Exposure Time', css_classes=["custom-input"])
shutter_speed_Text.disabled = True
analog_gain_Text = TextInput(width=WIDTH_TEXTS, value='Analog Gain', css_classes=["custom-input"])
analog_gain_Text.disabled = True
digital_gain_Text = TextInput(width=WIDTH_TEXTS, value='Digital Gain', css_classes=["custom-input"])
digital_gain_Text.disabled = True
white_balance_Text_1 = TextInput(width=WIDTH_TEXTS, value='White Balance R', css_classes=["custom-input"])
white_balance_Text_1.disabled = True
white_balance_Text_2 = TextInput(width=WIDTH_TEXTS, value='White Balance B', css_classes=["custom-input"])
white_balance_Text_2.disabled = True
sharpness = TextInput(width=WIDTH_TEXTS, value='Sharpness', css_classes=["custom-input"])
sharpness.disabled = True
contrast = TextInput(width=WIDTH_TEXTS, value='Contrast', css_classes=["custom-input"])
contrast.disabled = True
video_denoise = TextInput(width=WIDTH_TEXTS, value='Video Denoise', css_classes=["custom-input"])
video_denoise.disabled = True
self.settings_pre_select = Select(title='Predefined Settings:', value='Default - LED Flash',
options=['Default - LED Flash', 'Default - No LED Flash', 'Custom'],
width=200)
self.settings_pre_select.on_change('value', self.set_select_values)
self.shutter_speed_Input.js_link('value', self.shutter_speed, 'value')
self.shutter_speed.js_link('value', self.shutter_speed_Input, 'value')
self.analog_gain_Input.js_link('value', self.analog_gain, 'value')
self.analog_gain.js_link('value', self.analog_gain_Input, 'value')
self.digital_gain_Input.js_link('value', self.digital_gain, 'value')
self.digital_gain.js_link('value', self.digital_gain_Input, 'value')
self.white_balance_Input_1.js_link('value', self.white_balance_1, 'value')
self.white_balance_1.js_link('value', self.white_balance_Input_1, 'value')
self.white_balance_Input_2.js_link('value', self.white_balance_2, 'value')
self.white_balance_2.js_link('value', self.white_balance_Input_2, 'value')
self.sharpness_Input.js_link('value', self.sharpness, 'value')
self.sharpness.js_link('value', self.sharpness_Input, 'value')
self.contrast_Input.js_link('value', self.contrast, 'value')
self.contrast.js_link('value', self.contrast_Input, 'value')
# row(shutter_speed_Text, self.shutter_speed_Input, self.shutter_speed),
all_settings = column(row(analog_gain_Text, self.analog_gain_Input, self.analog_gain),
row(digital_gain_Text, self.digital_gain_Input, self.digital_gain),
row(white_balance_Text_1, self.white_balance_Input_1, self.white_balance_1),
row(white_balance_Text_2, self.white_balance_Input_2, self.white_balance_2),
row(sharpness, self.sharpness_Input, self.sharpness),
row(contrast, self.contrast_Input, self.contrast),
row(video_denoise, self.video_denoise),
spacing=25)
# self.settings = column(all_settings, self.settings_pre_select, spacing=25)
self.settings = all_settings
self.settings.visible = False
return column(self.btn_show_settings, self.settings)
[docs] def show_settings(self):
"""Gets called on button click to show/hide camera setting sliders and numeric inputs.
"""
if self.btn_show_settings.label == 'Show Camera Settings':
self.btn_show_settings.label = 'Hide Camera Settings'
self.settings.visible = True
else:
self.btn_show_settings.label = 'Show Camera Settings'
self.settings.visible = False
[docs] def set_select_values(self, attr, new, old):
"""Gets called on change of select widget's value and loads predefined values for the camera parameters.
"""
if old == 'Default - LED Flash':
self.shutter_speed.value, self.analog_gain.value = self.config.exposure_time, self.config.analog_gain()
self.digital_gain.value, self.white_balance_1.value = self.config.digital_gain
self.white_balance_1.value, self.white_balance_2.value = self.config.white_balance
elif old == 'Default - No LED Flash':
self.shutter_speed.value, self.analog_gain.value = int(1/self.config.camera_fps*1000000), 2
self.digital_gain.value, self.white_balance_1.value = 2, 2.25
self.white_balance_2.value = 2.25
else:
print('Load Values from file (not implemented yet)!')