BodyBalanceEvaluation/backend/tests/testsmit.py

86 lines
2.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import ctypes
import time
import numpy as np
import cv2
# === DLL 加载 ===
dll = ctypes.WinDLL(r"D:\BodyBalanceEvaluation\backend\tests\SMiTSenseUsbWrapper.dll")
dll.SMiTSenseUsb_Init.argtypes = [ctypes.c_int]
dll.SMiTSenseUsb_Init.restype = ctypes.c_int
dll.SMiTSenseUsb_ScanDevices.argtypes = [ctypes.POINTER(ctypes.c_int)]
dll.SMiTSenseUsb_ScanDevices.restype = ctypes.c_int
dll.SMiTSenseUsb_OpenAndStart.argtypes = [
ctypes.c_int,
ctypes.POINTER(ctypes.c_uint16),
ctypes.POINTER(ctypes.c_uint16)
]
dll.SMiTSenseUsb_OpenAndStart.restype = ctypes.c_int
dll.SMiTSenseUsb_GetLatestFrame.argtypes = [
ctypes.POINTER(ctypes.c_uint16),
ctypes.c_int
]
dll.SMiTSenseUsb_GetLatestFrame.restype = ctypes.c_int
dll.SMiTSenseUsb_StopAndClose.argtypes = []
dll.SMiTSenseUsb_StopAndClose.restype = ctypes.c_int
# === 初始化设备 ===
ret = dll.SMiTSenseUsb_Init(0)
if ret != 0:
raise RuntimeError(f"Init failed: {ret}")
count = ctypes.c_int()
ret = dll.SMiTSenseUsb_ScanDevices(ctypes.byref(count))
if ret != 0 or count.value == 0:
raise RuntimeError("No devices found")
rows = ctypes.c_uint16()
cols = ctypes.c_uint16()
ret = dll.SMiTSenseUsb_OpenAndStart(0, ctypes.byref(rows), ctypes.byref(cols))
if ret != 0:
raise RuntimeError("OpenAndStart failed")
rows, cols = rows.value, cols.value
frame_size = rows * cols
buf_type = ctypes.c_uint16 * frame_size
buf = buf_type()
print(f"实时采集: {rows} 行 x {cols}")
# 固定映射范围(和原来 matplotlib 一样)
vmin, vmax = 0, 1000
try:
while True:
ret = dll.SMiTSenseUsb_GetLatestFrame(buf, frame_size)
if ret == 0:
data = np.frombuffer(buf, dtype=np.uint16).reshape((rows, cols))
# 固定范围映射到 0-255
norm_data = np.clip((data - vmin) / (vmax - vmin) * 255, 0, 255).astype(np.uint8)
# 颜色映射jet
heatmap = cv2.applyColorMap(norm_data, cv2.COLORMAP_JET)
# 放大显示(保持 nearest 效果)
heatmap = cv2.resize(heatmap, (cols * 4, rows * 4), interpolation=cv2.INTER_NEAREST)
# 显示
cv2.imshow("SMiTSense 足底压力分布", heatmap)
if cv2.waitKey(1) & 0xFF == 27: # ESC 退出
break
else:
print("读取数据帧失败")
time.sleep(0.05) # 20 FPS
except KeyboardInterrupt:
pass
finally:
dll.SMiTSenseUsb_StopAndClose()
cv2.destroyAllWindows()
print("设备已关闭")