设置一下
This commit is contained in:
@@ -652,7 +652,7 @@ class CameraWorker(QThread):
|
||||
|
||||
config.enable_stream(color_profile)
|
||||
config.enable_stream(depth_profile)
|
||||
# 要求所有启用的流都到齐才输出帧集,避免不同时刻的帧被混合返回
|
||||
# 要求所有启用的流都到齐才输出帧集,保证每帧同步
|
||||
try:
|
||||
config.set_frame_aggregate_output_mode(
|
||||
OBFrameAggregateOutputMode.FULL_FRAME_REQUIRE)
|
||||
@@ -724,7 +724,8 @@ class CameraWorker(QThread):
|
||||
OBPermissionType.PERMISSION_READ_WRITE)
|
||||
if hdr_supported:
|
||||
hdr_use_interleave = dev.isFrameInterleaveSupported()
|
||||
hdr_filter = HDRMergeFilter()
|
||||
if not hdr_use_interleave:
|
||||
hdr_filter = HDRMergeFilter()
|
||||
except Exception as exc:
|
||||
self.log_msg.emit(f"HDR 检测警告:{exc}")
|
||||
|
||||
@@ -834,7 +835,7 @@ class CameraWorker(QThread):
|
||||
# 预览
|
||||
# HDR merge:用 merged 帧集替换深度帧
|
||||
display_frames = frames
|
||||
if self._hdr_enabled and hdr_filter is not None:
|
||||
if self._hdr_enabled and (not hdr_use_interleave) and hdr_filter is not None:
|
||||
try:
|
||||
merged = hdr_filter.process(frames)
|
||||
if merged:
|
||||
@@ -877,7 +878,7 @@ class CameraWorker(QThread):
|
||||
|
||||
depth_vis = depth_to_vis(depth_data, depth_scale)
|
||||
self._last_emit_ts = time.monotonic()
|
||||
self.preview_ready.emit(color_bgr.copy(), depth_vis.copy())
|
||||
self.preview_ready.emit(color_bgr, depth_vis)
|
||||
|
||||
except Exception as exc:
|
||||
if self._running:
|
||||
@@ -1250,6 +1251,8 @@ class MainWindow(QMainWindow):
|
||||
self._hotplug_pending = False
|
||||
self._pending_stream_cfg: tuple[dict, dict] | None = None
|
||||
self._closing = False
|
||||
self._latest_preview: tuple[np.ndarray, np.ndarray] | None = None
|
||||
self._preview_flush_scheduled = False
|
||||
self._session_dir: Path | None = None
|
||||
self._params_filename = "camera_params.json"
|
||||
self._color_profiles_data: list[dict] = []
|
||||
@@ -2001,7 +2004,7 @@ class MainWindow(QMainWindow):
|
||||
self._worker.set_splat(self.capture_splat_combo.currentData())
|
||||
if self.hdr_check.isChecked():
|
||||
self._worker.set_hdr(True)
|
||||
self._worker.preview_ready.connect(self._update_preview)
|
||||
self._worker.preview_ready.connect(self._on_preview_ready)
|
||||
self._worker.capture_done.connect(self._on_capture_done)
|
||||
self._worker.params_ready.connect(self._on_params_ready)
|
||||
self._worker.log_msg.connect(self._append_d2c_log)
|
||||
@@ -2014,6 +2017,8 @@ class MainWindow(QMainWindow):
|
||||
|
||||
def _stop_stream(self):
|
||||
self._pending_stream_cfg = None
|
||||
self._latest_preview = None
|
||||
self._preview_flush_scheduled = False
|
||||
if self._worker:
|
||||
self._retire_worker(self._worker)
|
||||
self._worker = None
|
||||
@@ -2035,6 +2040,8 @@ class MainWindow(QMainWindow):
|
||||
def _on_camera_disconnected(self):
|
||||
"""相机断开:静默关闭流,不弹窗。"""
|
||||
self._pending_stream_cfg = None
|
||||
self._latest_preview = None
|
||||
self._preview_flush_scheduled = False
|
||||
if self._worker:
|
||||
self._retire_worker(self._worker)
|
||||
self._worker = None
|
||||
@@ -2052,6 +2059,23 @@ class MainWindow(QMainWindow):
|
||||
# Preview
|
||||
# ─────────────────────────────────
|
||||
|
||||
def _on_preview_ready(self, color_bgr: np.ndarray, depth_vis: np.ndarray):
|
||||
self._latest_preview = (color_bgr, depth_vis)
|
||||
if self._preview_flush_scheduled:
|
||||
return
|
||||
self._preview_flush_scheduled = True
|
||||
QTimer.singleShot(0, self._flush_preview)
|
||||
|
||||
def _flush_preview(self):
|
||||
frame = self._latest_preview
|
||||
self._latest_preview = None
|
||||
if frame is not None:
|
||||
self._update_preview(*frame)
|
||||
if self._latest_preview is not None:
|
||||
QTimer.singleShot(0, self._flush_preview)
|
||||
else:
|
||||
self._preview_flush_scheduled = False
|
||||
|
||||
def _update_preview(self, color_bgr: np.ndarray, depth_vis: np.ndarray):
|
||||
w, h = self.color_lbl.width(), self.color_lbl.height()
|
||||
self.color_lbl.setPixmap(ndarray_to_pixmap(color_bgr, w, h))
|
||||
|
||||
Reference in New Issue
Block a user