microeye 2.3.2__tar.gz → 2.3.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {microeye-2.3.2/src/microeye.egg-info → microeye-2.3.3}/PKG-INFO +36 -10
- {microeye-2.3.2 → microeye-2.3.3}/README.md +34 -8
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/_version.py +1 -1
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/camera_options.py +5 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/camera_panel.py +163 -99
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/jobs.py +2 -1
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/shortcuts.py +96 -10
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/mieye/devices_manager.py +4 -2
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/mieye/miEye.py +2 -2
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/widgets/pycro_panel.py +6 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/kinesis/kinesis.py +1 -1
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/piezo_concept.py +1 -1
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/gui_helper.py +29 -2
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/uImage.py +12 -5
- {microeye-2.3.2 → microeye-2.3.3/src/microeye.egg-info}/PKG-INFO +36 -10
- {microeye-2.3.2 → microeye-2.3.3}/src/microeye.egg-info/requires.txt +1 -1
- {microeye-2.3.2 → microeye-2.3.3}/LICENSE +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/MANIFEST.in +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/pyproject.toml +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/setup.cfg +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/setup.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/checklist_dialog.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/cmosMaps.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/filters/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/filters/base.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/filters/spatial.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/filters/temporal.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/fit.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/nena.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/phasor_fit.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/processing.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/extract.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/rubost_mean.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/spline.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/stats/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/stats/core.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/stats/curve_fit.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/stats/io.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/stats/slope_fit.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/temp.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/test.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/CPUfunctions.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/CPUmleFit_LM.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/CPUsplineLib.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUfunctions.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUmleFit_LM_EMCCD.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUmleFit_LM_sCMOS.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUsplineLib.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/constants.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/mainfunctions.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/results.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/results_stats.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/tardis.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/multi_viewer.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/processing/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/processing/frc.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/rendering/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/rendering/base.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/rendering/cloud.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/rendering/core.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/rendering/volumetric.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/tools/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/tools/kymograms.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/tools/roi_selectors.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/utils/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/utils/coordinates.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/utils/images.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/utils/windows.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/viewer/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/viewer/image_options_widget.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/viewer/images.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/viewer/layers_widget.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/viewer/localizations.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/viewer/psf.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/viewer/volume.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/camera_calibration.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/camera_list.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/dummy/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/dummy/dummy_panel.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/line_profiler.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/linescan/IR_Cam.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/linescan/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/micam.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/pco/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/pco/enums.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/pco/pco_cam.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/pco/pco_panel.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/thorlabs/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/thorlabs/thorlabs.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/thorlabs/thorlabs_panel.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/ueye/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/ueye/ueye_camera.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/ueye/ueye_panel.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/vimba/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/vimba/vimba_cam.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/vimba/vimba_panel.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/device.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/lasers/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/lasers/io_matchbox.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/lasers/io_params.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/lasers/io_single_laser.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/lasers/laser_relay.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/mieye/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/mieye/acquisition_manager.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/misc/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/misc/acquisition_view.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/misc/reglo.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/misc/temp.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/port_config.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/protocols/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/protocols/actions.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/protocols/actions_items.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/protocols/designer.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/protocols/scene_manager.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/protocols/serialization.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/core.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/devices.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/enums.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/headless.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/utils.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/widgets/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/widgets/bridges.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/widgets/headless_manager.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/widgets/headless_options.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/baseDevice.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/device.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/deviceID.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/devicePort.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/deviceStatus.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/devicesView.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/ellDevices.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/messageUpdater.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/motorInfo.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/stage.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/test.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/kinesis/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/kinesis/kdc101/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/kinesis/kdc101/enums.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/kinesis/kdc101/factory.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/kinesis/kdc101/kdc101.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/stabilizer.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/stage.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/widgets/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/widgets/controller.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/widgets/devices.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/widgets/focusWidget.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/widgets/qlist_slider.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/widgets/scan_acquisition.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/1024.png +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/128.png +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/16.png +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/24.png +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/256.png +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/32.png +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/48.png +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/512.png +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/64.png +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/close.svg +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/mieye.png +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/min.svg +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/viewer.png +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/launcher.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/qt.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/enum_encoder.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/expandable_groupbox.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/hid/__init__.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/hid/controller.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/hid/device.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/hid/enums.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/hid/utils.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/labelled_slider.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/metadata.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/metadata_tree.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/micro_launcher.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/parameter_tree.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/pyscripting.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/retry_exec.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/start_gui.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/thread_worker.py +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microeye.egg-info/SOURCES.txt +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microeye.egg-info/dependency_links.txt +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microeye.egg-info/entry_points.txt +0 -0
- {microeye-2.3.2 → microeye-2.3.3}/src/microeye.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: microeye
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.3
|
|
4
4
|
Summary: A python toolkit for fluorescence microscopy that features hardware control, data analysis and vizualization for super-resolution single-molecule localization microscopy and single-partical tracking.
|
|
5
5
|
Home-page: https://github.com/samhitech/microEye
|
|
6
6
|
Author: Mohammad Nour Alsamsam
|
|
@@ -20,7 +20,7 @@ Requires-Dist: dask==2024.5.2
|
|
|
20
20
|
Requires-Dist: h5py==3.11.0
|
|
21
21
|
Requires-Dist: hidapi==0.14.0
|
|
22
22
|
Requires-Dist: matplotlib==3.9.2
|
|
23
|
-
Requires-Dist:
|
|
23
|
+
Requires-Dist: mmpycorex==0.3.16
|
|
24
24
|
Requires-Dist: numba==0.60.0
|
|
25
25
|
Requires-Dist: numpy==1.26.4
|
|
26
26
|
Requires-Dist: ome_types==0.5.2
|
|
@@ -85,7 +85,7 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
|
|
|
85
85
|
|
|
86
86
|

|
|
87
87
|

|
|
88
|
-

|
|
89
89
|
|
|
90
90
|

|
|
91
91
|

|
|
@@ -96,9 +96,9 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
|
|
|
96
96
|

|
|
97
97
|
|
|
98
98
|
```bash
|
|
99
|
-
__ ____ ____ ___ ____
|
|
100
|
-
/ |/ (_)__________ / __/_ _____ _ __|_ | |_ / |_
|
|
101
|
-
/ /|_/ / / __/ __/ _ \/ _// // / -_) | |/ / __/_ _/_ <_ /
|
|
99
|
+
__ ____ ____ ___ ____ ____
|
|
100
|
+
/ |/ (_)__________ / __/_ _____ _ __|_ | |_ / |_ /
|
|
101
|
+
/ /|_/ / / __/ __/ _ \/ _// // / -_) | |/ / __/_ _/_ <_ _/_ <
|
|
102
102
|
/_/ /_/_/\__/_/ \___/___/\_, /\__/ |___/____(_)____(_)____/
|
|
103
103
|
/___/
|
|
104
104
|
```
|
|
@@ -120,7 +120,9 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
|
|
|
120
120
|
- [Hardware](#hardware)
|
|
121
121
|
- [Supported Cameras](#supported-cameras)
|
|
122
122
|
- [Additional Hardware](#additional-hardware)
|
|
123
|
-
|
|
123
|
+
- [Pycro-Manager Integration](#pycro-manager-integration)
|
|
124
|
+
- [Features](#features)
|
|
125
|
+
- [How to Use](#how-to-use)
|
|
124
126
|
- [Authors](#authors)
|
|
125
127
|
- [People Involved](#people-involved)
|
|
126
128
|
- [Acknowledgement](#acknowledgement)
|
|
@@ -214,7 +216,6 @@ Upon running the launcher, you will be presented with the following interface:
|
|
|
214
216
|
- **Theme (dropdown)**: Select the theme for the application. Options are None (default), qdarktheme, or qdarkstyle.
|
|
215
217
|
|
|
216
218
|
To launch a module, simply click on the respective button (`miEye Module` or `Viewer Module`). If you wish to change the Qt API or theme, select the desired option from the dropdown menus before launching.
|
|
217
|
-
Sounds good, here's the updated section with the simplified commands:
|
|
218
219
|
|
|
219
220
|
## Modules
|
|
220
221
|
|
|
@@ -334,9 +335,34 @@ Schematic overview of the miEye instrument:
|
|
|
334
335
|
| RelayBox Arduino | For laser control using camera GPIO signals | [RelayBox](https://github.com/samhitech/RelayBox) |
|
|
335
336
|
| miEye OSF Project Parts List | Parts list of miEye OSF Project | [Link](https://osf.io/j2fqy/) |
|
|
336
337
|
|
|
337
|
-
|
|
338
|
+
## Pycro-Manager Integration
|
|
338
339
|
|
|
339
|
-
Integration
|
|
340
|
+
Integration with Pycro-Manager is now implemented, providing support for managing headless instances and `Core` instances. This allows for seamless control and configuration of hardware devices through the Pycro-Manager framework.
|
|
341
|
+
|
|
342
|
+
### Features
|
|
343
|
+
|
|
344
|
+
- **Headless Manager**: Manage multiple headless Micro-Manager instances (JavaBackend), including starting, stopping, and saving configurations.
|
|
345
|
+
- **Core Instances Manager**: Handle multiple PycroCore instances for device communication and control.
|
|
346
|
+
|
|
347
|
+
### How to Use
|
|
348
|
+
|
|
349
|
+
1. **Headless Manager**:
|
|
350
|
+
|
|
351
|
+
- Open the `miEye_module` and navigate to `Tools -> Micro-Manager Headless Manager` in the main menu.
|
|
352
|
+
- Start a new headless instance using a specific configuration file.
|
|
353
|
+
- Stop individual running instances or terminate all instances simultaneously.
|
|
354
|
+
- Save configurations for future use or load previously saved configurations for headless instances.
|
|
355
|
+
|
|
356
|
+
2. **Core Instances**:
|
|
357
|
+
|
|
358
|
+
- Open the `miEye_module` and navigate to `Tools -> Micro-Manager Core Bridges` in the main menu.
|
|
359
|
+
- Click on `Add Core Bridge` and provide the port address in the dialog box.
|
|
360
|
+
- A list of connected devices will be displayed, allowing you to view each device's properties.
|
|
361
|
+
- Close the window and refresh the camera list to access Pycro-Manager cameras.
|
|
362
|
+
|
|
363
|
+
_Accessing other types of devices is under development!_
|
|
364
|
+
|
|
365
|
+
_Note: Currently, only acquisition has been tested with the developed `PycroPanel`. Full implementation of focus stabilization is planned for future updates by implementing further stage-related widgets._
|
|
340
366
|
|
|
341
367
|

|
|
342
368
|
|
|
@@ -20,7 +20,7 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
|
|
|
20
20
|
|
|
21
21
|

|
|
22
22
|

|
|
23
|
-

|
|
24
24
|
|
|
25
25
|

|
|
26
26
|

|
|
@@ -31,9 +31,9 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
|
|
|
31
31
|

|
|
32
32
|
|
|
33
33
|
```bash
|
|
34
|
-
__ ____ ____ ___ ____
|
|
35
|
-
/ |/ (_)__________ / __/_ _____ _ __|_ | |_ / |_
|
|
36
|
-
/ /|_/ / / __/ __/ _ \/ _// // / -_) | |/ / __/_ _/_ <_ /
|
|
34
|
+
__ ____ ____ ___ ____ ____
|
|
35
|
+
/ |/ (_)__________ / __/_ _____ _ __|_ | |_ / |_ /
|
|
36
|
+
/ /|_/ / / __/ __/ _ \/ _// // / -_) | |/ / __/_ _/_ <_ _/_ <
|
|
37
37
|
/_/ /_/_/\__/_/ \___/___/\_, /\__/ |___/____(_)____(_)____/
|
|
38
38
|
/___/
|
|
39
39
|
```
|
|
@@ -55,7 +55,9 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
|
|
|
55
55
|
- [Hardware](#hardware)
|
|
56
56
|
- [Supported Cameras](#supported-cameras)
|
|
57
57
|
- [Additional Hardware](#additional-hardware)
|
|
58
|
-
|
|
58
|
+
- [Pycro-Manager Integration](#pycro-manager-integration)
|
|
59
|
+
- [Features](#features)
|
|
60
|
+
- [How to Use](#how-to-use)
|
|
59
61
|
- [Authors](#authors)
|
|
60
62
|
- [People Involved](#people-involved)
|
|
61
63
|
- [Acknowledgement](#acknowledgement)
|
|
@@ -149,7 +151,6 @@ Upon running the launcher, you will be presented with the following interface:
|
|
|
149
151
|
- **Theme (dropdown)**: Select the theme for the application. Options are None (default), qdarktheme, or qdarkstyle.
|
|
150
152
|
|
|
151
153
|
To launch a module, simply click on the respective button (`miEye Module` or `Viewer Module`). If you wish to change the Qt API or theme, select the desired option from the dropdown menus before launching.
|
|
152
|
-
Sounds good, here's the updated section with the simplified commands:
|
|
153
154
|
|
|
154
155
|
## Modules
|
|
155
156
|
|
|
@@ -269,9 +270,34 @@ Schematic overview of the miEye instrument:
|
|
|
269
270
|
| RelayBox Arduino | For laser control using camera GPIO signals | [RelayBox](https://github.com/samhitech/RelayBox) |
|
|
270
271
|
| miEye OSF Project Parts List | Parts list of miEye OSF Project | [Link](https://osf.io/j2fqy/) |
|
|
271
272
|
|
|
272
|
-
|
|
273
|
+
## Pycro-Manager Integration
|
|
273
274
|
|
|
274
|
-
Integration
|
|
275
|
+
Integration with Pycro-Manager is now implemented, providing support for managing headless instances and `Core` instances. This allows for seamless control and configuration of hardware devices through the Pycro-Manager framework.
|
|
276
|
+
|
|
277
|
+
### Features
|
|
278
|
+
|
|
279
|
+
- **Headless Manager**: Manage multiple headless Micro-Manager instances (JavaBackend), including starting, stopping, and saving configurations.
|
|
280
|
+
- **Core Instances Manager**: Handle multiple PycroCore instances for device communication and control.
|
|
281
|
+
|
|
282
|
+
### How to Use
|
|
283
|
+
|
|
284
|
+
1. **Headless Manager**:
|
|
285
|
+
|
|
286
|
+
- Open the `miEye_module` and navigate to `Tools -> Micro-Manager Headless Manager` in the main menu.
|
|
287
|
+
- Start a new headless instance using a specific configuration file.
|
|
288
|
+
- Stop individual running instances or terminate all instances simultaneously.
|
|
289
|
+
- Save configurations for future use or load previously saved configurations for headless instances.
|
|
290
|
+
|
|
291
|
+
2. **Core Instances**:
|
|
292
|
+
|
|
293
|
+
- Open the `miEye_module` and navigate to `Tools -> Micro-Manager Core Bridges` in the main menu.
|
|
294
|
+
- Click on `Add Core Bridge` and provide the port address in the dialog box.
|
|
295
|
+
- A list of connected devices will be displayed, allowing you to view each device's properties.
|
|
296
|
+
- Close the window and refresh the camera list to access Pycro-Manager cameras.
|
|
297
|
+
|
|
298
|
+
_Accessing other types of devices is under development!_
|
|
299
|
+
|
|
300
|
+
_Note: Currently, only acquisition has been tested with the developed `PycroPanel`. Full implementation of focus stabilization is planned for future updates by implementing further stage-related widgets._
|
|
275
301
|
|
|
276
302
|

|
|
277
303
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
version_info = (2, 3,
|
|
1
|
+
version_info = (2, 3, 3)
|
|
2
2
|
__version__ = '.'.join(map(str, version_info))
|
|
@@ -662,6 +662,11 @@ class CameraOptions(Tree):
|
|
|
662
662
|
'''
|
|
663
663
|
return self.get_param_value(CamParams.DISPLAY_STATS_OPTION)
|
|
664
664
|
|
|
665
|
+
def toggleDisplayStats(self):
|
|
666
|
+
param = self.get_param(CamParams.DISPLAY_STATS_OPTION)
|
|
667
|
+
if param:
|
|
668
|
+
param.setValue(not param.value())
|
|
669
|
+
|
|
665
670
|
@property
|
|
666
671
|
def isLineProfiler(self):
|
|
667
672
|
'''
|
|
@@ -6,6 +6,7 @@ import time
|
|
|
6
6
|
import traceback
|
|
7
7
|
from functools import lru_cache
|
|
8
8
|
from queue import Queue
|
|
9
|
+
from typing import Union
|
|
9
10
|
|
|
10
11
|
import cv2
|
|
11
12
|
import numpy as np
|
|
@@ -98,7 +99,7 @@ class Camera_Panel(QtWidgets.QGroupBox):
|
|
|
98
99
|
|
|
99
100
|
self._directory = os.path.join(home, 'Desktop') # save directory
|
|
100
101
|
self._save_path = '' # save path
|
|
101
|
-
self._save_prefix = ''
|
|
102
|
+
self._save_prefix = ''
|
|
102
103
|
|
|
103
104
|
# acquisition job info class
|
|
104
105
|
self.acq_job = None
|
|
@@ -119,7 +120,7 @@ class Camera_Panel(QtWidgets.QGroupBox):
|
|
|
119
120
|
self.main_layout.addWidget(self.main_tab_view)
|
|
120
121
|
|
|
121
122
|
# tab widgets
|
|
122
|
-
self.first_tab = QtWidgets.
|
|
123
|
+
self.first_tab = QtWidgets.QSplitter(QtCore.Qt.Orientation.Vertical)
|
|
123
124
|
|
|
124
125
|
self.OME_tab = MetadataEditorTree()
|
|
125
126
|
|
|
@@ -128,11 +129,6 @@ class Camera_Panel(QtWidgets.QGroupBox):
|
|
|
128
129
|
if not self.mini:
|
|
129
130
|
self.main_tab_view.addTab(self.OME_tab, 'OME-XML metadata')
|
|
130
131
|
|
|
131
|
-
# first tab vertical layout
|
|
132
|
-
self.first_tab_Layout = QtWidgets.QFormLayout()
|
|
133
|
-
# set as first tab layout
|
|
134
|
-
self.first_tab.setLayout(self.first_tab_Layout)
|
|
135
|
-
|
|
136
132
|
self.camera_options = CameraOptions()
|
|
137
133
|
|
|
138
134
|
# Create the camera shortcuts widget
|
|
@@ -148,7 +144,14 @@ class Camera_Panel(QtWidgets.QGroupBox):
|
|
|
148
144
|
r'(\d+)(?:_ms|ms)', name
|
|
149
145
|
) # find any number of format '000_ms' or '00ms'
|
|
150
146
|
if match:
|
|
147
|
+
unit = self.camera_options.get_param(CamParams.EXPOSURE).opts[
|
|
148
|
+
'suffix'
|
|
149
|
+
]
|
|
151
150
|
exposure = self._cam.getExposure()
|
|
151
|
+
if unit == 's':
|
|
152
|
+
exposure *= 1000
|
|
153
|
+
elif unit == 'us':
|
|
154
|
+
exposure /= 1000
|
|
152
155
|
# update the exposure time in the name
|
|
153
156
|
name = name.replace(match.group(0), f'{exposure:03.0f}ms')
|
|
154
157
|
else:
|
|
@@ -163,16 +166,44 @@ class Camera_Panel(QtWidgets.QGroupBox):
|
|
|
163
166
|
name = re.sub(r'^\d+', f'{index:03d}', name)
|
|
164
167
|
else:
|
|
165
168
|
name = f'001_{name}'
|
|
166
|
-
|
|
169
|
+
elif mode == 'unique_index':
|
|
170
|
+
# Check if folder exists within the chosen directory
|
|
171
|
+
directory = self.camera_options.get_param_value(
|
|
172
|
+
CamParams.SAVE_DIRECTORY
|
|
173
|
+
)
|
|
174
|
+
match = re.search(r'^\d+', name)
|
|
175
|
+
if match:
|
|
176
|
+
index = 1
|
|
177
|
+
while any(
|
|
178
|
+
folder.startswith(f'{index:03d}_')
|
|
179
|
+
for folder in os.listdir(directory)
|
|
180
|
+
if os.path.isdir(os.path.join(directory, folder))
|
|
181
|
+
):
|
|
182
|
+
index += 1
|
|
183
|
+
name = re.sub(r'^\d+', f'{index:03d}', name)
|
|
184
|
+
else:
|
|
185
|
+
index = 1
|
|
186
|
+
while os.path.exists(
|
|
187
|
+
os.path.join(directory, f'{index:03d}_{name}')
|
|
188
|
+
):
|
|
189
|
+
index += 1
|
|
190
|
+
name = f'{index:03d}_{name}'
|
|
167
191
|
|
|
168
192
|
self.camera_options.set_param_value(CamParams.EXPERIMENT_NAME, name)
|
|
169
193
|
|
|
170
|
-
|
|
171
194
|
self.cam_shortcuts.exposureChanged.connect(self.setExposure)
|
|
172
195
|
self.cam_shortcuts.autostretchChanged.connect(
|
|
173
196
|
self.camera_options.toggleAutostretch
|
|
174
197
|
)
|
|
175
198
|
self.cam_shortcuts.previewChanged.connect(self.camera_options.togglePreview)
|
|
199
|
+
self.cam_shortcuts.displayStatsChanged.connect(
|
|
200
|
+
self.camera_options.toggleDisplayStats
|
|
201
|
+
)
|
|
202
|
+
self.cam_shortcuts.displayModeChanged.connect(
|
|
203
|
+
lambda mode: self.camera_options.set_param_value(
|
|
204
|
+
CamParams.VIEW_OPTIONS, mode
|
|
205
|
+
)
|
|
206
|
+
)
|
|
176
207
|
self.cam_shortcuts.saveDataChanged.connect(self.camera_options.toggleSaveData)
|
|
177
208
|
self.cam_shortcuts.zoomChanged.connect(self.camera_options.setZoom)
|
|
178
209
|
self.cam_shortcuts.acquisitionStart.connect(self.start_free_run)
|
|
@@ -196,6 +227,12 @@ class Camera_Panel(QtWidgets.QGroupBox):
|
|
|
196
227
|
self.cam_shortcuts.set_preview(
|
|
197
228
|
self.camera_options.get_param_value(CamParams.PREVIEW)
|
|
198
229
|
)
|
|
230
|
+
self.cam_shortcuts.set_display_stats(
|
|
231
|
+
self.camera_options.get_param_value(CamParams.DISPLAY_STATS_OPTION)
|
|
232
|
+
)
|
|
233
|
+
self.cam_shortcuts.set_display_mode(
|
|
234
|
+
self.camera_options.get_param_value(CamParams.VIEW_OPTIONS)
|
|
235
|
+
)
|
|
199
236
|
self.cam_shortcuts.set_save_data(
|
|
200
237
|
self.camera_options.get_param_value(CamParams.SAVE_DATA)
|
|
201
238
|
)
|
|
@@ -204,14 +241,20 @@ class Camera_Panel(QtWidgets.QGroupBox):
|
|
|
204
241
|
# display menu but centered horizontally
|
|
205
242
|
menu.exec(
|
|
206
243
|
self.main_tab_view.mapToGlobal(
|
|
207
|
-
QtCore.QPoint(
|
|
244
|
+
QtCore.QPoint(
|
|
245
|
+
self.main_tab_view.rect().left()
|
|
246
|
+
+ (self.main_tab_view.rect().width() - menu.rect().width())
|
|
247
|
+
// 2,
|
|
248
|
+
pos.y(),
|
|
249
|
+
)
|
|
208
250
|
)
|
|
209
251
|
)
|
|
210
252
|
|
|
211
253
|
self.camera_options.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
|
|
212
254
|
self.camera_options.customContextMenuRequested.connect(show_shortcuts)
|
|
213
255
|
|
|
214
|
-
self.
|
|
256
|
+
self.first_tab.addWidget(self.camera_options)
|
|
257
|
+
self.first_tab.setStretchFactor(0, 1)
|
|
215
258
|
|
|
216
259
|
self.camera_options.get_param(
|
|
217
260
|
CamParams.EXPERIMENT_NAME
|
|
@@ -262,20 +305,50 @@ class Camera_Panel(QtWidgets.QGroupBox):
|
|
|
262
305
|
self.camera_options.viewOptionChanged.connect(lambda: self.view_toggled())
|
|
263
306
|
|
|
264
307
|
# controls for histogram and cdf
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
#
|
|
308
|
+
|
|
309
|
+
# Create a single plot with shared X-axis and
|
|
310
|
+
# separate Y-axes for histogram and CDF
|
|
268
311
|
self.histogram = pg.PlotWidget()
|
|
269
|
-
self.hist_cdf = pg.
|
|
312
|
+
self.hist_cdf = pg.ViewBox()
|
|
313
|
+
|
|
314
|
+
# Add the CDF ViewBox to the histogram plot
|
|
315
|
+
self.histogram.getPlotItem().scene().addItem(self.hist_cdf)
|
|
316
|
+
self.histogram.getPlotItem().getAxis('left').setLabel('HIST')
|
|
317
|
+
self.histogram.getPlotItem().getAxis('right').setLabel('CDF')
|
|
318
|
+
self.histogram.getPlotItem().showAxis('right')
|
|
319
|
+
self.histogram.getPlotItem().getAxis('right').linkToView(self.hist_cdf)
|
|
320
|
+
|
|
321
|
+
# Link the X-axis of the CDF ViewBox to the main plot
|
|
322
|
+
self.hist_cdf.setXLink(self.histogram.getPlotItem().getViewBox())
|
|
323
|
+
|
|
324
|
+
# Adjust the CDF ViewBox to match the main plot
|
|
325
|
+
def update_views():
|
|
326
|
+
self.hist_cdf.setGeometry(
|
|
327
|
+
self.histogram.getPlotItem().getViewBox().sceneBoundingRect()
|
|
328
|
+
)
|
|
329
|
+
self.hist_cdf.linkedViewChanged(
|
|
330
|
+
self.histogram.getPlotItem().getViewBox(), self.hist_cdf.XAxis
|
|
331
|
+
)
|
|
332
|
+
|
|
333
|
+
self.histogram.getPlotItem().getViewBox().sigResized.connect(update_views)
|
|
334
|
+
|
|
335
|
+
# Set up pens and brushes for histogram and CDF
|
|
270
336
|
greenP = pg.mkPen(color='g')
|
|
271
337
|
blueP = pg.mkPen(color='b')
|
|
338
|
+
cyanP = pg.mkPen(color='c')
|
|
339
|
+
yellowP = pg.mkPen(color='y')
|
|
272
340
|
greenB = pg.mkBrush(0, 255, 0, 32)
|
|
273
341
|
blueB = pg.mkBrush(0, 0, 255, 32)
|
|
342
|
+
|
|
343
|
+
# Add histogram and CDF plots
|
|
274
344
|
self._plot_ref = self.histogram.plot(self._bins, self._hist, pen=greenP)
|
|
275
|
-
self._cdf_plot_ref = self.hist_cdf.plot(self._bins, self._hist, pen=greenP)
|
|
276
345
|
self._plot_ref_2 = self.histogram.plot(self._bins, self._hist, pen=blueP)
|
|
277
|
-
self.
|
|
346
|
+
self._cdf_plot_ref = pg.PlotDataItem(self._bins, self._hist, pen=cyanP)
|
|
347
|
+
self._cdf_plot_ref_2 = pg.PlotDataItem(self._bins, self._hist, pen=yellowP)
|
|
348
|
+
self.hist_cdf.addItem(self._cdf_plot_ref)
|
|
349
|
+
self.hist_cdf.addItem(self._cdf_plot_ref_2)
|
|
278
350
|
|
|
351
|
+
# Add linear regions for histogram and CDF
|
|
279
352
|
self.lr_0 = pg.LinearRegionItem(
|
|
280
353
|
(0, self._nBins),
|
|
281
354
|
bounds=(0, self._nBins),
|
|
@@ -297,8 +370,9 @@ class Camera_Panel(QtWidgets.QGroupBox):
|
|
|
297
370
|
self.histogram.addItem(self.lr_0)
|
|
298
371
|
self.histogram.addItem(self.lr_1)
|
|
299
372
|
|
|
300
|
-
|
|
301
|
-
self.
|
|
373
|
+
# Add the histogram plot to the layout
|
|
374
|
+
self.first_tab.addWidget(self.histogram)
|
|
375
|
+
self.first_tab.setStretchFactor(1, 1)
|
|
302
376
|
|
|
303
377
|
CameraOptions.combine_params(self.PARAMS)
|
|
304
378
|
|
|
@@ -491,7 +565,7 @@ class Camera_Panel(QtWidgets.QGroupBox):
|
|
|
491
565
|
)
|
|
492
566
|
|
|
493
567
|
def view_toggled(self):
|
|
494
|
-
if self.camera_options.isSingleView:
|
|
568
|
+
if self.camera_options.isSingleView or self.camera_options.isROIsView:
|
|
495
569
|
self.lr_0.setSpan(0, 1)
|
|
496
570
|
self.lr_1.setMovable(False)
|
|
497
571
|
self.lr_1.setRegion((0, self._nBins))
|
|
@@ -734,17 +808,29 @@ def drawStats(frame: uImage):
|
|
|
734
808
|
]
|
|
735
809
|
|
|
736
810
|
# Font settings
|
|
737
|
-
font
|
|
811
|
+
font = cv2.FONT_HERSHEY_SIMPLEX
|
|
812
|
+
font_scale = 0.5 # Reduced font size
|
|
813
|
+
font_thickness = 1
|
|
814
|
+
font_color = (255, 255, 255) # White text
|
|
738
815
|
|
|
739
816
|
# Position to start adding text
|
|
740
|
-
x, y =
|
|
817
|
+
x, y = 10, 20
|
|
741
818
|
|
|
742
|
-
# Add each line of text to the image
|
|
819
|
+
# Add each line of text to the image with a background
|
|
743
820
|
for line in lines:
|
|
821
|
+
text_size = cv2.getTextSize(line, font, font_scale, font_thickness)[0]
|
|
822
|
+
text_x, text_y = x, y - text_size[1]
|
|
823
|
+
cv2.rectangle(
|
|
824
|
+
frame._view,
|
|
825
|
+
(text_x - 2, text_y - 2),
|
|
826
|
+
(text_x + text_size[0] + 2, text_y + text_size[1] + 2),
|
|
827
|
+
(0, 0, 0), # Black background
|
|
828
|
+
-1,
|
|
829
|
+
)
|
|
744
830
|
cv2.putText(
|
|
745
831
|
frame._view, line, (x, y), font, font_scale, font_color, font_thickness
|
|
746
832
|
)
|
|
747
|
-
y += int(
|
|
833
|
+
y += int(1.5 * text_size[1]) # Adjust vertical spacing
|
|
748
834
|
|
|
749
835
|
|
|
750
836
|
def update_histogram_and_display(params: AcquisitionJob, camp: Camera_Panel):
|
|
@@ -758,113 +844,91 @@ def update_histogram_and_display(params: AcquisitionJob, camp: Camera_Panel):
|
|
|
758
844
|
camp : Camera_Panel
|
|
759
845
|
The camera panel to display data.
|
|
760
846
|
'''
|
|
761
|
-
|
|
847
|
+
|
|
848
|
+
def process_frame(frame: uImage, region=None, zoom=None):
|
|
849
|
+
'''Helper to process a single frame.'''
|
|
850
|
+
frame.equalizeLUT(region, camp.camera_options.isNumpyLUT)
|
|
851
|
+
if zoom is None:
|
|
852
|
+
zoom = camp.camera_options.get_param_value(CamParams.RESIZE_DISPLAY)
|
|
853
|
+
frame._view = cv2.resize(
|
|
854
|
+
frame._view, (0, 0), fx=zoom, fy=zoom, interpolation=cv2.INTER_NEAREST
|
|
855
|
+
)
|
|
856
|
+
|
|
857
|
+
if camp.camera_options.isDisplayStats:
|
|
858
|
+
drawStats(frame)
|
|
859
|
+
return frame
|
|
860
|
+
|
|
861
|
+
def display_frame(name, frame: Union[uImage, np.ndarray]):
|
|
862
|
+
'''Helper to display a single frame.'''
|
|
863
|
+
if isinstance(frame, uImage):
|
|
864
|
+
frame = frame._view
|
|
865
|
+
|
|
866
|
+
cv2.imshow(name, frame)
|
|
867
|
+
|
|
762
868
|
if camp.camera_options.isSingleView or (
|
|
763
869
|
camp.camera_options.isROIsView and len(params.rois) == 0
|
|
764
870
|
):
|
|
765
|
-
|
|
871
|
+
region = (
|
|
766
872
|
None
|
|
767
873
|
if camp.camera_options.isAutostretch
|
|
768
874
|
else tuple(map(math.ceil, camp.lr_0.getRegion()))
|
|
769
875
|
)
|
|
770
|
-
|
|
771
|
-
params.frame.equalizeLUT(_range, camp.camera_options.isNumpyLUT)
|
|
772
|
-
|
|
876
|
+
params.frame = process_frame(params.frame, region)
|
|
773
877
|
camp.updateRangeSignal.emit(params.frame._min, params.frame._max)
|
|
774
|
-
|
|
775
878
|
camp.updateStatsSignal.emit((params.frame, None))
|
|
879
|
+
display_frame(params.name, params.frame)
|
|
776
880
|
|
|
777
|
-
# resizing the image
|
|
778
|
-
zoom = camp.camera_options.get_param_value(CamParams.RESIZE_DISPLAY)
|
|
779
|
-
|
|
780
|
-
if camp.camera_options.isDisplayStats:
|
|
781
|
-
drawStats(params.frame)
|
|
782
|
-
|
|
783
|
-
params.frame._view = cv2.resize(
|
|
784
|
-
params.frame._view,
|
|
785
|
-
(0, 0),
|
|
786
|
-
fx=zoom,
|
|
787
|
-
fy=zoom,
|
|
788
|
-
interpolation=cv2.INTER_NEAREST,
|
|
789
|
-
)
|
|
790
|
-
|
|
791
|
-
# display it
|
|
792
|
-
cv2.imshow(params.name, params.frame._view)
|
|
793
881
|
elif camp.camera_options.isROIsView:
|
|
794
|
-
if len(params.rois) == 1:
|
|
795
|
-
camp._plot_ref_2.setData(camp._hist)
|
|
796
|
-
camp._cdf_plot_ref_2.setData(camp._hist)
|
|
797
882
|
images, mins, maxs = [], [], []
|
|
798
883
|
for idx, roi in enumerate(params.rois):
|
|
799
884
|
uimage = uImage(
|
|
800
885
|
params.frame.image[roi[1] : roi[1] + roi[3], roi[0] : roi[0] + roi[2]]
|
|
801
886
|
)
|
|
802
|
-
|
|
803
887
|
if idx > 0 and params.flip_rois:
|
|
804
888
|
uimage.image = np.fliplr(uimage.image)
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
uimage.equalizeLUT(_range, camp.camera_options.isNumpyLUT)
|
|
813
|
-
|
|
889
|
+
region = (
|
|
890
|
+
None
|
|
891
|
+
if camp.camera_options.isAutostretch
|
|
892
|
+
else tuple(map(math.ceil, camp.lr_0.getRegion()))
|
|
893
|
+
)
|
|
894
|
+
uimage = process_frame(uimage, region)
|
|
814
895
|
mins.append(uimage._min)
|
|
815
896
|
maxs.append(uimage._max)
|
|
816
897
|
images.append(uimage)
|
|
817
|
-
|
|
818
|
-
# resizing the image
|
|
819
|
-
zoom = camp.camera_options.get_param_value(CamParams.RESIZE_DISPLAY)
|
|
820
|
-
uimage._view = cv2.resize(
|
|
821
|
-
uimage._view, (0, 0), fx=zoom, fy=zoom, interpolation=cv2.INTER_NEAREST
|
|
822
|
-
)
|
|
823
|
-
|
|
824
|
-
# display it
|
|
825
|
-
cv2.imshow(params.name + f' ROI {idx + 1}', uimage._view)
|
|
826
|
-
|
|
898
|
+
display_frame(f'ROI {idx + 1}', uimage)
|
|
827
899
|
camp.updateRangeSignal.emit(min(mins), max(maxs))
|
|
828
900
|
camp.updateStatsSignal.emit(tuple(images))
|
|
829
|
-
else:
|
|
830
|
-
_rang_left = None
|
|
831
|
-
_rang_right = None
|
|
832
|
-
|
|
833
|
-
# image stretching
|
|
834
|
-
if not camp.camera_options.isAutostretch:
|
|
835
|
-
_rang_left = tuple(map(math.ceil, camp.lr_0.getRegion()))
|
|
836
|
-
_rang_right = tuple(map(math.ceil, camp.lr_1.getRegion()))
|
|
837
901
|
|
|
902
|
+
else:
|
|
838
903
|
left, right = params.frame.hsplitView()
|
|
839
|
-
|
|
840
|
-
left
|
|
841
|
-
|
|
842
|
-
|
|
904
|
+
zoom = camp.camera_options.get_param_value(CamParams.RESIZE_DISPLAY)
|
|
905
|
+
left = process_frame(
|
|
906
|
+
left,
|
|
907
|
+
None
|
|
908
|
+
if camp.camera_options.isAutostretch
|
|
909
|
+
else tuple(map(math.ceil, camp.lr_0.getRegion())),
|
|
910
|
+
zoom=zoom,
|
|
911
|
+
)
|
|
912
|
+
right = process_frame(
|
|
913
|
+
right,
|
|
914
|
+
None
|
|
915
|
+
if camp.camera_options.isAutostretch
|
|
916
|
+
else tuple(map(math.ceil, camp.lr_1.getRegion())),
|
|
917
|
+
zoom=zoom,
|
|
918
|
+
)
|
|
843
919
|
camp.updateRangeSignal.emit(
|
|
844
920
|
min(left._min, right._min), max(left._max, right._max)
|
|
845
921
|
)
|
|
846
922
|
camp.updateStatsSignal.emit((left, right))
|
|
847
923
|
|
|
848
|
-
zoom = camp.camera_options.get_param_value(CamParams.RESIZE_DISPLAY)
|
|
849
924
|
if camp.camera_options.isOverlaidView:
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
_img, (0, 0), fx=zoom, fy=zoom, interpolation=cv2.INTER_NEAREST
|
|
855
|
-
)
|
|
856
|
-
|
|
857
|
-
cv2.imshow(params.name, _img)
|
|
925
|
+
overlaid_img = np.zeros(left._view.shape[:2] + (3,), dtype=np.uint8)
|
|
926
|
+
overlaid_img[..., 1] = left._view
|
|
927
|
+
overlaid_img[..., 0] = right._view
|
|
928
|
+
display_frame(params.name, overlaid_img)
|
|
858
929
|
else:
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
(0, 0),
|
|
862
|
-
fx=zoom,
|
|
863
|
-
fy=zoom,
|
|
864
|
-
interpolation=cv2.INTER_NEAREST,
|
|
865
|
-
)
|
|
866
|
-
|
|
867
|
-
cv2.imshow(params.name, _img)
|
|
930
|
+
concatenated_img = np.concatenate([left._view, right._view], axis=1)
|
|
931
|
+
display_frame(params.name, concatenated_img)
|
|
868
932
|
|
|
869
933
|
|
|
870
934
|
def cam_display(params: AcquisitionJob, camp: Camera_Panel, **kwargs):
|
|
@@ -11,6 +11,7 @@ import tifffile as tf
|
|
|
11
11
|
import zarr
|
|
12
12
|
|
|
13
13
|
from microEye.hardware.cams.camera_calibration import dark_calibration
|
|
14
|
+
from microEye.utils.uImage import uImage
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
class AcquisitionJob:
|
|
@@ -205,7 +206,7 @@ class AcquisitionJob:
|
|
|
205
206
|
'''cross-thread attribute (use lock)'''
|
|
206
207
|
self.display_time = 0.0
|
|
207
208
|
'''cross-thread attribute (use lock)'''
|
|
208
|
-
self.frame = None
|
|
209
|
+
self.frame : uImage = None
|
|
209
210
|
'''cross-thread attribute (use lock)'''
|
|
210
211
|
self.frames_captured = 0
|
|
211
212
|
'''cross-thread attribute (use lock)'''
|