From f9b9f94c8124dcbc20b2843f28b28576a9933ce9 Mon Sep 17 00:00:00 2001 From: root <13910913995@163.com> Date: Fri, 22 Aug 2025 09:17:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=88=AA=E5=9B=BE=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=BF=9D=E5=AD=98=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/config.ini | 4 +- .../202508030001/20250813134852/feet.mp4 | Bin 258 -> 0 bytes .../202508030001/20250813134852/screen.webm | Bin 34127 -> 0 bytes backend/devices/screen_recorder.py | 99 ++++++++---------- backend/devices/utils/config.ini | 4 +- backend/main.py | 4 +- frontend/src/renderer/src/services/api.js | 4 +- 7 files changed, 49 insertions(+), 66 deletions(-) delete mode 100644 backend/data/patients/202508030001/20250813134852/feet.mp4 delete mode 100644 backend/data/patients/202508030001/20250813134852/screen.webm diff --git a/backend/config.ini b/backend/config.ini index 07e1f81e..86af0128 100644 --- a/backend/config.ini +++ b/backend/config.ini @@ -15,7 +15,7 @@ backup_interval = 24 max_backups = 7 [CAMERA] -device_index = 0 +device_index = 1 width = 1280 height = 720 fps = 30 @@ -29,7 +29,7 @@ depth_range_max = 1500 [DEVICES] imu_device_type = real -imu_port = COM3 +imu_port = COM8 imu_baudrate = 9600 pressure_device_type = real pressure_use_mock = False diff --git a/backend/data/patients/202508030001/20250813134852/feet.mp4 b/backend/data/patients/202508030001/20250813134852/feet.mp4 deleted file mode 100644 index 566a00f0e71ff103685b622895a3e4d9c1ea6c06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258 zcmZQzV30{GsVvAW&d+6FU}6B#Kx~v-U}DI?z`&7Kl$r{nb5jyafb_N8{QNQ?os(OZ zkpiTV0P_nlhmnB+h!6mU0~AK%J0MhIV=(~*lS)%c5`lD7ZYr1tsZ-2I$teOcKp;0I vvna8kAP2&Okh+;U#UKZ(t}MyV2hy@Y_k#=pTkn%tmS$?9XKtovXkY*UpLrva diff --git a/backend/data/patients/202508030001/20250813134852/screen.webm b/backend/data/patients/202508030001/20250813134852/screen.webm deleted file mode 100644 index 8a192007490557b025ff630f55c8621f0884acad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34127 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 OZ+|RMUAG@~4F4bc*#>|B diff --git a/backend/devices/screen_recorder.py b/backend/devices/screen_recorder.py index e53a4a4e..477a3d80 100644 --- a/backend/devices/screen_recorder.py +++ b/backend/devices/screen_recorder.py @@ -503,20 +503,20 @@ class RecordingManager: - def collect_detection_data(self, session_id: str, patient_id: str) -> Dict[str, Any]: + def collect_detection_data(self, session_id: str, patient_id: str, detection_data: Dict[str, Any]) -> Dict[str, Any]: """ - 采集所有设备数据并保存到指定目录结构 + 保存前端传入的检测数据和图片 Args: session_id: 检测会话ID patient_id: 患者ID + detection_data: 前端传入的检测数据,包含base64格式的图片数据 Returns: Dict: 包含所有采集数据的字典,符合detection_data表结构 """ # 生成采集时间戳 timestamp = datetime.now().strftime('%Y%m%d_%H%M%S_%f')[:-3] # 精确到毫秒 - data_base_dir= Path(f'data/patients/{patient_id}/{session_id}/{timestamp}') if getattr(sys, 'frozen', False): # 打包后的exe文件路径 exe_dir = os.path.dirname(sys.executable) @@ -537,73 +537,56 @@ class RecordingManager: # 初始化数据字典 data = { 'session_id': session_id, - 'head_pose': None, + 'head_pose': detection_data.get('head_pose'), 'body_pose': None, 'body_image': None, - 'foot_data': None, - 'foot_image': None, + 'foot_data': detection_data.get('foot_data'), 'foot_data_image': None, + 'foot_image': None, 'screen_image': None, + 'timestamp': timestamp } try: - # 1. 采集头部姿态数据(从IMU设备获取) - # 注意:这里需要从外部传入IMU设备或者在初始化时添加IMU管理器 - # if self.imu_manager and self.imu_manager.is_connected: - # head_pose_data = self._collect_head_pose_data() - # if head_pose_data: - # data['head_pose'] = json.dumps(head_pose_data) - # self.logger.debug(f'头部姿态数据采集成功: {session_id}') + # 保存图片数据 + image_fields = [ + ('body_image', 'body'), + ('foot_image', 'foot'), + ('foot_data_image', 'foot_data'), + ('screen_image', 'screen') + ] - # 2. 采集身体姿态数据(从FemtoBolt深度相机获取) - if self.femtobolt_manager and self.femtobolt_manager.is_connected: - body_pose_data = self._collect_body_pose_data() - if body_pose_data: - data['body_pose'] = json.dumps(body_pose_data) - self.logger.debug(f'身体姿态数据采集成功: {session_id}') + for field, prefix in image_fields: + base64_data = detection_data.get(field) + if base64_data: + try: + # 移除base64头部信息 + if ';base64,' in base64_data: + base64_data = base64_data.split(';base64,')[1] + + # 解码base64数据 + image_data = base64.b64decode(base64_data) + + # 生成图片文件名 + filename = f'{prefix}_{timestamp}.jpg' + file_path = data_dir / filename + + # 保存图片 + with open(file_path, 'wb') as f: + f.write(image_data) + + # 更新数据字典中的图片路径 + data[field] = str(os.path.join('data', 'patients', patient_id, session_id, timestamp, filename)) + self.logger.debug(f'{field}保存成功: {filename}') + + except Exception as e: + self.logger.error(f'保存{field}失败: {e}') - # 3. 采集身体视频截图(从FemtoBolt深度相机获取) - if self.femtobolt_manager and self.femtobolt_manager.is_connected: - try: - body_image_path = self._capture_body_image(data_dir) - if body_image_path: - data['body_image'] = str(os.path.join(data_base_dir,body_image_path)) - self.logger.debug(f'身体截图保存成功: {body_image_path}') - except Exception as e: - self.logger.error(f'采集身体截图异常: {e}') - - # 4. 采集足部压力数据(从压力传感器获取) - if self.pressure_manager and hasattr(self.pressure_manager, 'is_connected') and self.pressure_manager.is_connected: - foot_data = self._collect_foot_pressure_data() - if foot_data: - data['foot_data'] = json.dumps(foot_data) - self.logger.debug(f'足部压力数据采集成功: {session_id}') - - # 5. 采集足部监测视频截图(从摄像头获取) - if self.camera_manager and self.camera_manager.is_connected: - foot_image_path = self._capture_foot_image(data_dir) - if foot_image_path: - data['foot_image'] = str(os.path.join(data_base_dir,foot_image_path)) - self.logger.debug(f'足部截图保存成功: {foot_image_path}') - - # # 6. 生成足底压力数据图(从压力传感器数据生成) - # if self.pressure_manager and hasattr(self.pressure_manager, 'is_connected') and self.pressure_manager.is_connected: - # foot_data_image_path = self._generate_foot_pressure_image(data_dir) - # if foot_data_image_path: - # data['foot_data_image'] = str(foot_data_image_path) - # self.logger.debug(f'足底压力数据图生成成功: {foot_data_image_path}') - - # 7. 采集屏幕截图 - screen_image_path = self._capture_screen_image(data_dir) - if screen_image_path: - data['screen_image'] = str(os.path.join(data_base_dir,screen_image_path)) - self.logger.debug(f'屏幕截图保存成功: {screen_image_path}') - - self.logger.debug(f'数据采集完成: {session_id}, 时间戳: {timestamp}') + self.logger.debug(f'数据保存完成: {session_id}, 时间戳: {timestamp}') except Exception as e: - self.logger.error(f'数据采集失败: {e}') + self.logger.error(f'数据保存失败: {e}') return data diff --git a/backend/devices/utils/config.ini b/backend/devices/utils/config.ini index 5cf905ba..5e372f83 100644 --- a/backend/devices/utils/config.ini +++ b/backend/devices/utils/config.ini @@ -15,7 +15,7 @@ backup_interval = 24 max_backups = 7 [CAMERA] -device_index = 3 +device_index = 1 width = 1280 height = 720 fps = 30 @@ -29,7 +29,7 @@ depth_range_max = 1700 [DEVICES] imu_device_type = real -imu_port = COM3 +imu_port = COM8 imu_baudrate = 9600 pressure_device_type = real pressure_use_mock = False diff --git a/backend/main.py b/backend/main.py index 7fcbf172..ef958e59 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1163,7 +1163,6 @@ class AppServer: # 获取请求数据 data = flask_request.get_json() or {} patient_id = data.get('patient_id') - screen_image_base64 = data.get('imageData') # 如果没有提供patient_id,从会话信息中获取 if not patient_id: @@ -1184,7 +1183,8 @@ class AppServer: # 调用录制管理器采集数据 collected_data = self.recording_manager.collect_detection_data( session_id=session_id, - patient_id=patient_id + patient_id=patient_id, + detection_data=data ) # 将采集的数据保存到数据库 diff --git a/frontend/src/renderer/src/services/api.js b/frontend/src/renderer/src/services/api.js index 1c471ff8..6c673a9d 100644 --- a/frontend/src/renderer/src/services/api.js +++ b/frontend/src/renderer/src/services/api.js @@ -13,7 +13,7 @@ api.interceptors.request.use( if (window.electronAPI) { config.baseURL = window.electronAPI.getBackendUrl() } else { - config.baseURL = 'http://192.168.1.173:5000' + config.baseURL = 'http://192.168.1.58:5000' } // 只为需要发送数据的请求设置Content-Type @@ -631,7 +631,7 @@ export const getBackendUrl = () => { if (window.electronAPI) { return window.electronAPI.getBackendUrl() } else { - return 'http://192.168.1.173:5000' + return 'http://192.168.1.58:5000' } }