diff --git a/README.md b/README.md index 22ad78b..ba54228 100644 --- a/README.md +++ b/README.md @@ -39,4 +39,14 @@ - 10008 引入口监测 - 10009 调压箱监测 :无 不检测调压箱 - 10010 实时数据上传 -- 其他识别内容: 9: '土堆' 17: '路锥', 18: '铁锹', 20: '风镐' \ No newline at end of file +- 其他识别内容: 9: '土堆' 17: '路锥', 18: '铁锹', 20: '风镐' + +## 功能需求 + +点位1:识别 井盖(塌陷 移位 破损 缺失,都认为是完整),井眼,发送位置让机械臂转动, 报【井盖完整,燃气浓度正常/异常】 +点位2:识别 引入口(目前没识别),发送位置让机械臂转动,报 【XXXX,燃气浓度正常/异常】 +点位3:识别 调压箱(目前没识别),???,报【XXXX,燃气浓度正常/异常】 + +以上都是机器狗走到目标点位,才执行 + +另外全程实时检测第三方施工,检测到目标物,报【识别到XX(目标名称),发现第三方施工】:保证识别目标:路锥、工服(反光衣) \ No newline at end of file diff --git a/README.md b/README.md index 22ad78b..ba54228 100644 --- a/README.md +++ b/README.md @@ -39,4 +39,14 @@ - 10008 引入口监测 - 10009 调压箱监测 :无 不检测调压箱 - 10010 实时数据上传 -- 其他识别内容: 9: '土堆' 17: '路锥', 18: '铁锹', 20: '风镐' \ No newline at end of file +- 其他识别内容: 9: '土堆' 17: '路锥', 18: '铁锹', 20: '风镐' + +## 功能需求 + +点位1:识别 井盖(塌陷 移位 破损 缺失,都认为是完整),井眼,发送位置让机械臂转动, 报【井盖完整,燃气浓度正常/异常】 +点位2:识别 引入口(目前没识别),发送位置让机械臂转动,报 【XXXX,燃气浓度正常/异常】 +点位3:识别 调压箱(目前没识别),???,报【XXXX,燃气浓度正常/异常】 + +以上都是机器狗走到目标点位,才执行 + +另外全程实时检测第三方施工,检测到目标物,报【识别到XX(目标名称),发现第三方施工】:保证识别目标:路锥、工服(反光衣) \ No newline at end of file diff --git a/config.py b/config.py index b34efef..e3438b0 100644 --- a/config.py +++ b/config.py @@ -1,49 +1,49 @@ # config.py CAMERAS = [ - # { - # "cam_id": 0, - # "gst_str": ( - # "v4l2src device=/dev/video0 ! " - # "image/jpeg, width=1280, height=720, framerate=30/1 ! " - # "jpegdec ! videoconvert ! appsink" - # ), - # # "gst_str": ( - # # "v4l2src device=/dev/video0 ! " - # # "image/jpeg, width=1280, height=720, framerate=30/1 ! " - # # "jpegparse ! jpegdec ! videoconvert ! appsink" - # # ), - # # "gst_str": ( - # # "v4l2src device=/dev/video0 ! image/jpeg, width=1280, height=720, framerate=30/1 ! " - # # "jpegparse ! jpegdec ! videoconvert ! video/x-raw, format=BGR ! appsink drop=true sync=false" - # # ), - # "tcp_send_cls": ["井盖眼"], - # "remark": "机械臂摄像头", - # "save_annotated_images": True, - # "frame_interval": 5, - # "receive_capture_command": True - # }, - # { - # "cam_id": 1, - # "gst_str": ( - # "udpsrc address=230.1.1.1 port=1720 multicast-iface=eth0 ! " - # "application/x-rtp, media=video, encoding-name=H264 ! " - # "rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! " - # "video/x-raw,width=1280,height=720,format=BGR ! appsink drop=1" - # ), - # "tcp_send_cls": [], - # "remark": "机器狗前置摄像头", - # "save_annotated_images": True, - # "frame_interval": 5, - # }, { "cam_id": 0, - "gst_str": 0, + "gst_str": ( + "v4l2src device=/dev/video0 ! " + "image/jpeg, width=1280, height=720, framerate=30/1 ! " + "jpegdec ! videoconvert ! appsink" + ), + # "gst_str": ( + # "v4l2src device=/dev/video0 ! " + # "image/jpeg, width=1280, height=720, framerate=30/1 ! " + # "jpegparse ! jpegdec ! videoconvert ! appsink" + # ), + # "gst_str": ( + # "v4l2src device=/dev/video0 ! image/jpeg, width=1280, height=720, framerate=30/1 ! " + # "jpegparse ! jpegdec ! videoconvert ! video/x-raw, format=BGR ! appsink drop=true sync=false" + # ), "tcp_send_cls": ["井盖眼"], - "frame_interval": 5, - "remark": "本地测试摄像头", + "remark": "机械臂摄像头", "save_annotated_images": True, + "frame_interval": 5, "receive_capture_command": True }, + { + "cam_id": 1, + "gst_str": ( + "udpsrc address=230.1.1.1 port=1720 multicast-iface=eth0 ! " + "application/x-rtp, media=video, encoding-name=H264 ! " + "rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! " + "video/x-raw,width=1280,height=720,format=BGR ! appsink drop=1" + ), + "tcp_send_cls": [], + "remark": "机器狗前置摄像头", + "save_annotated_images": True, + "frame_interval": 5, + }, + # { + # "cam_id": 0, + # "gst_str": 0, + # "tcp_send_cls": ["井盖眼"], + # "frame_interval": 5, + # "remark": "本地测试摄像头", + # "save_annotated_images": True, + # "receive_capture_command": True + # }, ] TCP_SERVER = { @@ -53,6 +53,7 @@ HTTP_SERVER = { "url": "http://111.198.10.15:11645/algorithm/receiveData", + # "url": "http://192.168.150.39:30028/algorithm/receiveData", "timeout": 10 # 超时重试 } diff --git a/README.md b/README.md index 22ad78b..ba54228 100644 --- a/README.md +++ b/README.md @@ -39,4 +39,14 @@ - 10008 引入口监测 - 10009 调压箱监测 :无 不检测调压箱 - 10010 实时数据上传 -- 其他识别内容: 9: '土堆' 17: '路锥', 18: '铁锹', 20: '风镐' \ No newline at end of file +- 其他识别内容: 9: '土堆' 17: '路锥', 18: '铁锹', 20: '风镐' + +## 功能需求 + +点位1:识别 井盖(塌陷 移位 破损 缺失,都认为是完整),井眼,发送位置让机械臂转动, 报【井盖完整,燃气浓度正常/异常】 +点位2:识别 引入口(目前没识别),发送位置让机械臂转动,报 【XXXX,燃气浓度正常/异常】 +点位3:识别 调压箱(目前没识别),???,报【XXXX,燃气浓度正常/异常】 + +以上都是机器狗走到目标点位,才执行 + +另外全程实时检测第三方施工,检测到目标物,报【识别到XX(目标名称),发现第三方施工】:保证识别目标:路锥、工服(反光衣) \ No newline at end of file diff --git a/config.py b/config.py index b34efef..e3438b0 100644 --- a/config.py +++ b/config.py @@ -1,49 +1,49 @@ # config.py CAMERAS = [ - # { - # "cam_id": 0, - # "gst_str": ( - # "v4l2src device=/dev/video0 ! " - # "image/jpeg, width=1280, height=720, framerate=30/1 ! " - # "jpegdec ! videoconvert ! appsink" - # ), - # # "gst_str": ( - # # "v4l2src device=/dev/video0 ! " - # # "image/jpeg, width=1280, height=720, framerate=30/1 ! " - # # "jpegparse ! jpegdec ! videoconvert ! appsink" - # # ), - # # "gst_str": ( - # # "v4l2src device=/dev/video0 ! image/jpeg, width=1280, height=720, framerate=30/1 ! " - # # "jpegparse ! jpegdec ! videoconvert ! video/x-raw, format=BGR ! appsink drop=true sync=false" - # # ), - # "tcp_send_cls": ["井盖眼"], - # "remark": "机械臂摄像头", - # "save_annotated_images": True, - # "frame_interval": 5, - # "receive_capture_command": True - # }, - # { - # "cam_id": 1, - # "gst_str": ( - # "udpsrc address=230.1.1.1 port=1720 multicast-iface=eth0 ! " - # "application/x-rtp, media=video, encoding-name=H264 ! " - # "rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! " - # "video/x-raw,width=1280,height=720,format=BGR ! appsink drop=1" - # ), - # "tcp_send_cls": [], - # "remark": "机器狗前置摄像头", - # "save_annotated_images": True, - # "frame_interval": 5, - # }, { "cam_id": 0, - "gst_str": 0, + "gst_str": ( + "v4l2src device=/dev/video0 ! " + "image/jpeg, width=1280, height=720, framerate=30/1 ! " + "jpegdec ! videoconvert ! appsink" + ), + # "gst_str": ( + # "v4l2src device=/dev/video0 ! " + # "image/jpeg, width=1280, height=720, framerate=30/1 ! " + # "jpegparse ! jpegdec ! videoconvert ! appsink" + # ), + # "gst_str": ( + # "v4l2src device=/dev/video0 ! image/jpeg, width=1280, height=720, framerate=30/1 ! " + # "jpegparse ! jpegdec ! videoconvert ! video/x-raw, format=BGR ! appsink drop=true sync=false" + # ), "tcp_send_cls": ["井盖眼"], - "frame_interval": 5, - "remark": "本地测试摄像头", + "remark": "机械臂摄像头", "save_annotated_images": True, + "frame_interval": 5, "receive_capture_command": True }, + { + "cam_id": 1, + "gst_str": ( + "udpsrc address=230.1.1.1 port=1720 multicast-iface=eth0 ! " + "application/x-rtp, media=video, encoding-name=H264 ! " + "rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! " + "video/x-raw,width=1280,height=720,format=BGR ! appsink drop=1" + ), + "tcp_send_cls": [], + "remark": "机器狗前置摄像头", + "save_annotated_images": True, + "frame_interval": 5, + }, + # { + # "cam_id": 0, + # "gst_str": 0, + # "tcp_send_cls": ["井盖眼"], + # "frame_interval": 5, + # "remark": "本地测试摄像头", + # "save_annotated_images": True, + # "receive_capture_command": True + # }, ] TCP_SERVER = { @@ -53,6 +53,7 @@ HTTP_SERVER = { "url": "http://111.198.10.15:11645/algorithm/receiveData", + # "url": "http://192.168.150.39:30028/algorithm/receiveData", "timeout": 10 # 超时重试 } diff --git a/global_logger.py b/global_logger.py index e88e989..fed8eee 100644 --- a/global_logger.py +++ b/global_logger.py @@ -4,6 +4,22 @@ import sys from logging.handlers import TimedRotatingFileHandler + +def process_log_data(data, head=50, tail=50): + """处理日志数据,将 'picture' 键的值截断,其他键保持原样""" + processed = {} + for k, v in data.items(): + if isinstance(v, str): + # 如果字符串太长,进行截断显示 + if len(v) > head + tail: + processed[k] = v[:head] + "..." + v[-tail:] + else: + processed[k] = v + else: + processed[k] = v + return processed + + # 确保日志目录存在 log_dir = 'logs' if not os.path.exists(log_dir): @@ -13,7 +29,6 @@ logger = logging.getLogger("casic_algo_server_logger") logger.setLevel(logging.DEBUG) # 设置日志级别 - # 创建一个TimedRotatingFileHandler handler = TimedRotatingFileHandler( os.path.join(log_dir, 'app.log'), # 日志文件名 diff --git a/README.md b/README.md index 22ad78b..ba54228 100644 --- a/README.md +++ b/README.md @@ -39,4 +39,14 @@ - 10008 引入口监测 - 10009 调压箱监测 :无 不检测调压箱 - 10010 实时数据上传 -- 其他识别内容: 9: '土堆' 17: '路锥', 18: '铁锹', 20: '风镐' \ No newline at end of file +- 其他识别内容: 9: '土堆' 17: '路锥', 18: '铁锹', 20: '风镐' + +## 功能需求 + +点位1:识别 井盖(塌陷 移位 破损 缺失,都认为是完整),井眼,发送位置让机械臂转动, 报【井盖完整,燃气浓度正常/异常】 +点位2:识别 引入口(目前没识别),发送位置让机械臂转动,报 【XXXX,燃气浓度正常/异常】 +点位3:识别 调压箱(目前没识别),???,报【XXXX,燃气浓度正常/异常】 + +以上都是机器狗走到目标点位,才执行 + +另外全程实时检测第三方施工,检测到目标物,报【识别到XX(目标名称),发现第三方施工】:保证识别目标:路锥、工服(反光衣) \ No newline at end of file diff --git a/config.py b/config.py index b34efef..e3438b0 100644 --- a/config.py +++ b/config.py @@ -1,49 +1,49 @@ # config.py CAMERAS = [ - # { - # "cam_id": 0, - # "gst_str": ( - # "v4l2src device=/dev/video0 ! " - # "image/jpeg, width=1280, height=720, framerate=30/1 ! " - # "jpegdec ! videoconvert ! appsink" - # ), - # # "gst_str": ( - # # "v4l2src device=/dev/video0 ! " - # # "image/jpeg, width=1280, height=720, framerate=30/1 ! " - # # "jpegparse ! jpegdec ! videoconvert ! appsink" - # # ), - # # "gst_str": ( - # # "v4l2src device=/dev/video0 ! image/jpeg, width=1280, height=720, framerate=30/1 ! " - # # "jpegparse ! jpegdec ! videoconvert ! video/x-raw, format=BGR ! appsink drop=true sync=false" - # # ), - # "tcp_send_cls": ["井盖眼"], - # "remark": "机械臂摄像头", - # "save_annotated_images": True, - # "frame_interval": 5, - # "receive_capture_command": True - # }, - # { - # "cam_id": 1, - # "gst_str": ( - # "udpsrc address=230.1.1.1 port=1720 multicast-iface=eth0 ! " - # "application/x-rtp, media=video, encoding-name=H264 ! " - # "rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! " - # "video/x-raw,width=1280,height=720,format=BGR ! appsink drop=1" - # ), - # "tcp_send_cls": [], - # "remark": "机器狗前置摄像头", - # "save_annotated_images": True, - # "frame_interval": 5, - # }, { "cam_id": 0, - "gst_str": 0, + "gst_str": ( + "v4l2src device=/dev/video0 ! " + "image/jpeg, width=1280, height=720, framerate=30/1 ! " + "jpegdec ! videoconvert ! appsink" + ), + # "gst_str": ( + # "v4l2src device=/dev/video0 ! " + # "image/jpeg, width=1280, height=720, framerate=30/1 ! " + # "jpegparse ! jpegdec ! videoconvert ! appsink" + # ), + # "gst_str": ( + # "v4l2src device=/dev/video0 ! image/jpeg, width=1280, height=720, framerate=30/1 ! " + # "jpegparse ! jpegdec ! videoconvert ! video/x-raw, format=BGR ! appsink drop=true sync=false" + # ), "tcp_send_cls": ["井盖眼"], - "frame_interval": 5, - "remark": "本地测试摄像头", + "remark": "机械臂摄像头", "save_annotated_images": True, + "frame_interval": 5, "receive_capture_command": True }, + { + "cam_id": 1, + "gst_str": ( + "udpsrc address=230.1.1.1 port=1720 multicast-iface=eth0 ! " + "application/x-rtp, media=video, encoding-name=H264 ! " + "rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! " + "video/x-raw,width=1280,height=720,format=BGR ! appsink drop=1" + ), + "tcp_send_cls": [], + "remark": "机器狗前置摄像头", + "save_annotated_images": True, + "frame_interval": 5, + }, + # { + # "cam_id": 0, + # "gst_str": 0, + # "tcp_send_cls": ["井盖眼"], + # "frame_interval": 5, + # "remark": "本地测试摄像头", + # "save_annotated_images": True, + # "receive_capture_command": True + # }, ] TCP_SERVER = { @@ -53,6 +53,7 @@ HTTP_SERVER = { "url": "http://111.198.10.15:11645/algorithm/receiveData", + # "url": "http://192.168.150.39:30028/algorithm/receiveData", "timeout": 10 # 超时重试 } diff --git a/global_logger.py b/global_logger.py index e88e989..fed8eee 100644 --- a/global_logger.py +++ b/global_logger.py @@ -4,6 +4,22 @@ import sys from logging.handlers import TimedRotatingFileHandler + +def process_log_data(data, head=50, tail=50): + """处理日志数据,将 'picture' 键的值截断,其他键保持原样""" + processed = {} + for k, v in data.items(): + if isinstance(v, str): + # 如果字符串太长,进行截断显示 + if len(v) > head + tail: + processed[k] = v[:head] + "..." + v[-tail:] + else: + processed[k] = v + else: + processed[k] = v + return processed + + # 确保日志目录存在 log_dir = 'logs' if not os.path.exists(log_dir): @@ -13,7 +29,6 @@ logger = logging.getLogger("casic_algo_server_logger") logger.setLevel(logging.DEBUG) # 设置日志级别 - # 创建一个TimedRotatingFileHandler handler = TimedRotatingFileHandler( os.path.join(log_dir, 'app.log'), # 日志文件名 diff --git a/handle_tcp_command.py b/handle_tcp_command.py index 8e4f437..8e7d5d8 100644 --- a/handle_tcp_command.py +++ b/handle_tcp_command.py @@ -4,7 +4,7 @@ import re import time import cv2 -from global_logger import logger +from global_logger import logger, process_log_data class HandelTCPCommand: @@ -25,26 +25,32 @@ return False try: + skip_img = int(preset) == 5 and float(gas_data) <= 0 # 将图像编码为JPEG - success, jpg_data = cv2.imencode('.jpg', frame) + success, jpg_data = cv2.imencode('.jpg', frame) if not skip_img else (True, None) if not success: logger.error(f"摄像头 {cam_id} 编码图像失败") return False - def get_cap_content(preset): + def get_cap_content(preset, gas_data): map = { "1": ('10006', '第三方施工监测', 1), "2": ('10007', '闸井监测', 0), "3": ('10008', '引入口监测', 0), "4": ('10009', '调压箱监测 ', 0), + "5": ('10011', '燃气泄漏', 0 if float(gas_data) <= 0 else 1), } return map.get(str(preset), ('', '', 0)) # 构建请求数据 - report_type, content, status = get_cap_content(preset) + report_type, content, status = get_cap_content(preset, gas_data) + + if int(preset) == 5: + status = 0 if float(gas_data) <= 0 else 1 + request_data = { "routeNumber": preset, - "picture": base64.b64encode(jpg_data.tobytes()).decode('utf-8'), + "picture": base64.b64encode(jpg_data.tobytes()).decode('utf-8') if (jpg_data is not None and jpg_data.size > 0) else '', "reportType": report_type, "reportContent": content, "isAlarm": status, @@ -52,6 +58,7 @@ "gpsPoints": f'{longitude},{latitude}' } + logger.debug(process_log_data(request_data)) # 发送HTTP请求 await self.http_client.send([request_data]) logger.info(f"摄像头 {cam_id} 已发送当前帧到后台") @@ -74,10 +81,6 @@ logger.debug(f"preset = {preset}, gas_data = {gas_data}, longitude = {longitude}, latitude = {latitude}") - # 等待5秒 - logger.info(f"收到捕获图像命令,等待5秒...") - await asyncio.sleep(5) - # 对所有摄像头执行 for cam_id, processor in self.camera_processors.items(): await self.capture_and_send_current_frame(processor, preset, gas_data, longitude, latitude)