Expose sample density and sample repeat for simulation camera to the UI in camera settings rather than as init options
This commit is contained in:
parent
159e2d14ab
commit
7b9f4aa202
1 changed files with 24 additions and 13 deletions
|
|
@ -80,8 +80,6 @@ class SimulatedCamera(BaseCamera):
|
||||||
thing_server_interface: lt.ThingServerInterface,
|
thing_server_interface: lt.ThingServerInterface,
|
||||||
shape: tuple[int, int, int] = (616, 820, 3),
|
shape: tuple[int, int, int] = (616, 820, 3),
|
||||||
canvas_shape: tuple[int, int, int] = (1500, 2000, 3),
|
canvas_shape: tuple[int, int, int] = (1500, 2000, 3),
|
||||||
repeating: bool = True,
|
|
||||||
blob_density: int = 300,
|
|
||||||
frame_interval: float = 0.1,
|
frame_interval: float = 0.1,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Initialise the simulated with settings for how images are generated.
|
"""Initialise the simulated with settings for how images are generated.
|
||||||
|
|
@ -90,11 +88,6 @@ class SimulatedCamera(BaseCamera):
|
||||||
:param canvas_shape: The shape (size) of the canvas generated on initialisation
|
:param canvas_shape: The shape (size) of the canvas generated on initialisation
|
||||||
that images are cropped from. If this is too large the it uses resources,
|
that images are cropped from. If this is too large the it uses resources,
|
||||||
but its size limits the range of motion of the simulation.
|
but its size limits the range of motion of the simulation.
|
||||||
:param repeating: If set True, outside the canvas, the
|
|
||||||
camera won't generate any blobs, preventing scanning from running
|
|
||||||
indefinitely allowing testing of demonstrating background detect. If False
|
|
||||||
the canvas will repeat.
|
|
||||||
:param blob_density: The number of blobs per million pixels.
|
|
||||||
:param frame_interval: Nominally the time between frames on the MJPEG stream,
|
:param frame_interval: Nominally the time between frames on the MJPEG stream,
|
||||||
however the rate may be slower due to calculation time for focus.
|
however the rate may be slower due to calculation time for focus.
|
||||||
"""
|
"""
|
||||||
|
|
@ -103,15 +96,26 @@ class SimulatedCamera(BaseCamera):
|
||||||
self.ds_shape = _downsample_shape(shape)
|
self.ds_shape = _downsample_shape(shape)
|
||||||
self.glyph_size = 101 // DOWNSAMPLE
|
self.glyph_size = 101 // DOWNSAMPLE
|
||||||
self.canvas_shape = _downsample_shape(canvas_shape)
|
self.canvas_shape = _downsample_shape(canvas_shape)
|
||||||
self.repeating = repeating
|
|
||||||
self.frame_interval = frame_interval
|
self.frame_interval = frame_interval
|
||||||
self._capture_thread: Optional[Thread] = None
|
self._capture_thread: Optional[Thread] = None
|
||||||
self._capture_enabled = False
|
self._capture_enabled = False
|
||||||
self.generate_sprites()
|
self.generate_sprites()
|
||||||
self.generate_blobs(
|
|
||||||
int(blob_density * 1e-6 * canvas_shape[0] * canvas_shape[1])
|
repeating: bool = lt.property(default=False)
|
||||||
)
|
|
||||||
self.generate_canvas()
|
_blob_density: int = 400
|
||||||
|
|
||||||
|
@lt.property
|
||||||
|
def blob_density(self) -> int:
|
||||||
|
"""The number of blobs per million pixels."""
|
||||||
|
return self._blob_density
|
||||||
|
|
||||||
|
@blob_density.setter
|
||||||
|
def blob_density(self, value: int) -> None:
|
||||||
|
self._blob_density = value
|
||||||
|
if self._capture_enabled:
|
||||||
|
self.generate_canvas()
|
||||||
|
|
||||||
@lt.property
|
@lt.property
|
||||||
def calibration_required(self) -> bool:
|
def calibration_required(self) -> bool:
|
||||||
|
|
@ -181,6 +185,8 @@ class SimulatedCamera(BaseCamera):
|
||||||
Canvas is int16 so that random noise can be added to simulation image before
|
Canvas is int16 so that random noise can be added to simulation image before
|
||||||
changing to unit8 to stop wrapping.
|
changing to unit8 to stop wrapping.
|
||||||
"""
|
"""
|
||||||
|
n_pixels = self.canvas_shape[0] * self.canvas_shape[1] * DOWNSAMPLE**2
|
||||||
|
self.generate_blobs(int(self.blob_density * 1e-6 * n_pixels))
|
||||||
self.blank_canvas = np.ones(self.canvas_shape, dtype=np.int16)
|
self.blank_canvas = np.ones(self.canvas_shape, dtype=np.int16)
|
||||||
self.blank_canvas[:, :, 0] *= BG_COLOR[0]
|
self.blank_canvas[:, :, 0] *= BG_COLOR[0]
|
||||||
self.blank_canvas[:, :, 1] *= BG_COLOR[1]
|
self.blank_canvas[:, :, 1] *= BG_COLOR[1]
|
||||||
|
|
@ -280,6 +286,7 @@ class SimulatedCamera(BaseCamera):
|
||||||
|
|
||||||
def __enter__(self) -> Self:
|
def __enter__(self) -> Self:
|
||||||
"""Start the capture thread when the Thing context manager is opened."""
|
"""Start the capture thread when the Thing context manager is opened."""
|
||||||
|
self.generate_canvas()
|
||||||
self.start_streaming()
|
self.start_streaming()
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
|
@ -439,7 +446,11 @@ class SimulatedCamera(BaseCamera):
|
||||||
@lt.property
|
@lt.property
|
||||||
def manual_camera_settings(self) -> list[PropertyControl]:
|
def manual_camera_settings(self) -> list[PropertyControl]:
|
||||||
"""The camera settings to expose as property controls in the settings panel."""
|
"""The camera settings to expose as property controls in the settings panel."""
|
||||||
return [property_control_for(self, "noise_level", label="Noise Level")]
|
return [
|
||||||
|
property_control_for(self, "repeating", label="Infinite Sample"),
|
||||||
|
property_control_for(self, "blob_density", label="Sample Density"),
|
||||||
|
property_control_for(self, "noise_level", label="Noise Level"),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def _frame2bytes(frame: Image.Image) -> bytes:
|
def _frame2bytes(frame: Image.Image) -> bytes:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue