added contact gpu support

This commit is contained in:
bluepulsar
2025-12-28 21:20:37 +08:00
parent e8e4fd8625
commit 4f8165b04b
4 changed files with 218 additions and 19 deletions
+21 -2
View File
@@ -249,7 +249,12 @@ class Sensor:
if multiple_foe:
return compute_multiple_foe(self.vnormal, min_contour_area=min_contour_area, min_magnitude=min_magnitude, expansion_threshold=expansion_threshold, downsample_factor=downsample_factor, kernel_size=kernel_size, denoise_sigma=denoise_sigma)
else:
return compute_foe(self.vnormal, min_magnitude=min_magnitude, expansion_threshold=expansion_threshold, downsample_factor=downsample_factor, kernel_size=kernel_size, denoise_sigma=denoise_sigma)
if self.cuda:
return compute_foe_gpu(self.vnormal, min_magnitude=min_magnitude, expansion_threshold=expansion_threshold, downsample_factor=downsample_factor, kernel_size=kernel_size, denoise_sigma=denoise_sigma)
else:
return compute_foe(self.vnormal, min_magnitude=min_magnitude, expansion_threshold=expansion_threshold, downsample_factor=downsample_factor, kernel_size=kernel_size, denoise_sigma=denoise_sigma)
def get_depth(self, denoise_sigma=15):
return getFilteredDensity(self.vnormal, use_cuda=self.cuda)
@@ -327,13 +332,15 @@ class Sensor:
self._capture_queue = Queue(maxsize=queue_size)
self._flow_queue = Queue(maxsize=queue_size)
self._result_queue = Queue(maxsize=queue_size)
self._contact_queue = Queue(maxsize=queue_size)
self._stop_event = Event()
self._async_enabled = True
self._capture_thread = Thread(target=self._capture_worker, daemon=True)
self._flow_thread = Thread(target=self._flow_worker, daemon=True)
self._compute_thread = Thread(target=self._hhd_worker, daemon=True)
self._contact_thread = Thread(target=self._contact_worker, daemon=True)
self._capture_thread.start()
self._flow_thread.start()
self._compute_thread.start()
@@ -567,6 +574,18 @@ class Sensor:
except Exception as e:
if self.verbose: print(f"HHD error: {e}")
def _contact_worker(self):
"""Stage 4: Contact computation."""
while not self._stop_event.is_set():
try:
img, flow = self._flow_queue.get(timeout=0.1)
contact_result = self.get_contact(flow)
self._queue_put(self._result_queue, contact_result)
except Empty:
continue
except Exception as e:
if self.verbose: print(f"Contact error: {e}")
# =========================================================================
# Private - Utilities
# =========================================================================