summaryrefslogtreecommitdiff
path: root/plugins/motion_capture/camera_panel.py
diff options
context:
space:
mode:
authorChristian Kolset <christian.kolset@gmail.com>2026-06-09 19:39:35 -0600
committerChristian Kolset <christian.kolset@gmail.com>2026-06-09 19:39:35 -0600
commitb776e70b4cd94c5d1f53dde39b2e46f6447cac3e (patch)
treefade07a8ecd7a771c095a4d636fa5570e1f8ee7c /plugins/motion_capture/camera_panel.py
parent51f04ada503b02c598c9940c96fdc444cf5da52a (diff)
Motion capture: profile support, FPS config, persistent tracking, window state
Profile integration: - CameraDevice.get_save_config() serialises camera_index, simulate, resolution, fps — cameras now persist in .labdaq profiles - ProfileManager.register/unregister_device_factory() lets plugins register their device classes for profile restoration without core → plugin dependency - MotionCapturePlugin registers CameraDevice factory on load/unload Camera configuration: - Add Frame Rate combo to CameraPanel (Default/15/24/30/60/120 fps) defaults to 30 fps; flows through to CAP_PROP_FPS on connect - tracker.start() accepts fps param alongside existing resolution Tracking persistence: - CameraTracker.is_running() — checks thread alive state - MotionCaptureWindow initialises _connected from tracker.is_running() so reopening the window resumes the live feed without restarting the camera or losing the active tracking state Window state: - Plugin saves px_per_mm + camera_idx when window closes - Reopened window restores saved values and syncs mode/shape UI from tracker state via restore_ui_state() (signals blocked to avoid resetting tracker) - Window type changed to Qt.WindowType.Window for independent close button on all Linux WMs Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'plugins/motion_capture/camera_panel.py')
-rw-r--r--plugins/motion_capture/camera_panel.py18
1 files changed, 18 insertions, 0 deletions
diff --git a/plugins/motion_capture/camera_panel.py b/plugins/motion_capture/camera_panel.py
index 5e25f7f..279945e 100644
--- a/plugins/motion_capture/camera_panel.py
+++ b/plugins/motion_capture/camera_panel.py
@@ -21,6 +21,15 @@ _RESOLUTIONS = {
"2560 × 1440": (2560, 1440),
}
+_FPS = {
+ "Default": None,
+ "15 fps": 15,
+ "24 fps": 24,
+ "30 fps": 30,
+ "60 fps": 60,
+ "120 fps": 120,
+}
+
class CameraScanThread(QThread):
cameras_found = pyqtSignal(list) # list of (index: int, label: str)
@@ -64,7 +73,14 @@ class CameraPanel(QWidget):
form.setContentsMargins(0, 0, 0, 0)
self.res_cb = QComboBox()
self.res_cb.addItems(list(_RESOLUTIONS.keys()))
+ self.res_cb.setCurrentText("1280 × 720")
form.addRow("Resolution:", self.res_cb)
+
+ self.fps_cb = QComboBox()
+ self.fps_cb.addItems(list(_FPS.keys()))
+ self.fps_cb.setCurrentText("30 fps")
+ form.addRow("Frame Rate:", self.fps_cb)
+
lay.addLayout(form)
note = QLabel(
@@ -91,9 +107,11 @@ class CameraPanel(QWidget):
resolution: Optional[Tuple[int, int]] = _RESOLUTIONS.get(
self.res_cb.currentText()
)
+ fps: Optional[int] = _FPS.get(self.fps_cb.currentText())
return CameraDevice(
device_id=device_id,
camera_index=self._selected_index,
simulate=self._simulate,
resolution=resolution,
+ fps=fps,
)