فهرست منبع

吊篮后端逻辑修改

dxc 1 سال پیش
والد
کامیت
1b0a3644ff
4فایلهای تغییر یافته به همراه244 افزوده شده و 122 حذف شده
  1. 21 77
      app5.py
  2. 174 36
      basket_cleaning_detect.py
  3. 36 6
      config.py
  4. 13 3
      globals.py

+ 21 - 77
app5.py

@@ -3,8 +3,7 @@ import threading
 import time
 from flask import Flask, jsonify,send_from_directory
 
-from basket_cleaning_detect import start_basket_cleaning_detection
-from platform_remove_detect import start_platform_remove_detection,init_platform_remove_detection
+from basket_cleaning_detect import start_basket_cleaning_detection,init_basket_cleaning_detection
 from globals import inference_thread, stop_event,redis_client
 
 
@@ -28,7 +27,7 @@ def basket_cleaning_detection():#开启平台搭设检测
         
             
         app.logger.info('start_platform_setup_detection')
-        #init_platform_setup_detection()
+        init_basket_cleaning_detection()
 
 
         # 等待所有YOLO线程开始检测
@@ -41,88 +40,33 @@ def basket_cleaning_detection():#开启平台搭设检测
         app.logger.info("reset_detection already running")   
         return jsonify({"status": "ALREADY_RUNNING"}), 200    
 
-# @app.route('/basket_cleaning_status', methods=['GET']) 
-# def basket_cleaning_status():#获取平台搭设状态状态
-#     if not redis_client.exists('platform_setup_order'):#平台搭设步骤还没有一个完成
-#         app.logger.info('platform_setup_order is none')
+@app.route('/basket_cleaning_status', methods=['GET']) 
+def basket_cleaning_status():#获取平台搭设状态状态
+    if not redis_client.exists('basket_cleaning_order'):#平台搭设步骤还没有一个完成
+        app.logger.info('basket_cleaning_order is none')
 
-#         return jsonify({"status": "NONE"}), 200
+        return jsonify({"status": "NONE"}), 200
     
-#     else:
-
-#         platform_setup_order = redis_client.lrange("platform_setup_order", 0, -1)
-
-#         json_array = []
-#         for value in platform_setup_order:
-#             match = re.search(r'platform_setup_(\d+)', value)
-#             step_number = match.group(1)
-#             json_object = {"step": step_number, "image": redis_client.get(f"platform_setup_{step_number}_img"),'number':redis_client.get(f"platform_setup_{step_number}")}
-#             json_array.append(json_object) 
-
-#         return jsonify({"status": "SUCCESS","data":json_array}), 200
-
-
-# @app.route('/basket_cleaning_finish', methods=['GET']) 
-# def basket_cleaning_finish():#开始登录时,检测是否需要复位,若需要,则发送复位信息,否则开始焊接检测
-
-#     stop_inference_internal()
-#     app.logger.info('platform_setup_finish')
-#     return jsonify({"status": "SUCCESS"}), 200
-
-            
-
-# @app.route('/platform_remove_detection', methods=['GET']) 
-# def platform_remove_detection():#开始登录时,检测是否需要复位,若需要,则发送复位信息,否则开始焊接检测
-#     global inference_thread#当全局变量需要重新赋值时,需要用global关键字声明
-
-#     if inference_thread is None or not inference_thread.is_alive():#防止重复开启检测服务
-#         #redis_client.set("log_in_flag",'False')
-
-#         stop_event.clear()
-
-#         start_events = []#给每个线程一个事件,让我知道某个线程是否开始检测
-#         inference_thread = threading.Thread(target=start_platform_remove_detection,args=(start_events,))
-#         inference_thread.start()
-        
-            
-#         app.logger.info('start_platform_remove_detection')
-#         init_platform_remove_detection()
-
-
-#         # 等待所有YOLO线程开始检测
-#         for event in start_events:
-#             event.wait()
-
-#         return jsonify({"status": "SUCCESS"}), 200
-    
-#     else:
-#         app.logger.info("reset_detection already running")   
-#         return jsonify({"status": "ALREADY_RUNNING"}), 200    
-    
-# @app.route('/platform_remove_status', methods=['GET']) 
-# def platform_remove_status():#开始登录时,检测是否需要复位,若需要,则发送复位信息,否则开始焊接检测
-#     if not redis_client.exists('platform_remove_order'):#平台搭设步骤还没有一个完成
-#         app.logger.info('platform_remove_order is none')
+    else:
 
-#         return jsonify({"status": "NONE"}), 200
-    
-#     else:
+        basket_cleaning_order = redis_client.lrange("basket_cleaning_order", 0, -1)
 
-#         platform_setup_order = redis_client.lrange("platform_remove_order", 0, -1)
+        json_array = []
+        for value in basket_cleaning_order:
+            match = re.search(r'basket_step_(\d+)', value)
+            step_number = match.group(1)
+            json_object = {"step": step_number, "image": redis_client.get(f"basket_step_{step_number}")}
+            json_array.append(json_object) 
 
-#         json_array = []
-#         for num in platform_setup_order:
+        return jsonify({"status": "SUCCESS","data":json_array}), 200
 
-#             json_object = {"step": num, "image": redis_client.get(f"platform_remove_{num}_img")}
-#             json_array.append(json_object) 
 
-#         return jsonify({"status": "SUCCESS","data":json_array}), 200
+@app.route('/basket_cleaning_finish', methods=['GET']) 
+def basket_cleaning_finish():#开始登录时,检测是否需要复位,若需要,则发送复位信息,否则开始焊接检测
 
-# @app.route('/platform_remove_finish', methods=['GET'])#点击考试结束按钮,停止检测,并复位
-# def platform_remove_finish():
-#     stop_inference_internal()
-#     app.logger.info('platform_remove_finish')
-#     return jsonify({"status": "SUCCESS"}), 200
+    stop_inference_internal()
+    app.logger.info('basket_cleaning_order')
+    return jsonify({"status": "SUCCESS"}), 200
 
 
     

+ 174 - 36
basket_cleaning_detect.py

@@ -8,32 +8,45 @@ from ultralytics import YOLO
 
 from utils.tool import IoU
 from globals import stop_event,redis_client
-from config import SAVE_IMG_PATH,POST_IMG_PATH4,BASKET_CLEANING_VIDEO_SOURCES,BASKET_CLEANING_MODEL_SOURCES
-from globals import basket_suspension_flag,basket_warning_zone_flag,basket_steel_wire_flag
+from config import SAVE_IMG_PATH,POST_IMG_PATH5,BASKET_CLEANING_VIDEO_SOURCES,BASKET_CLEANING_MODEL_SOURCES
+from config import BASKET_SUSPENSION_REGION,BASKET_STEEL_WIRE_REGION,BASKET_PLATFORM_REGION,BASKET_LIFTING_REGION,BASKET_ELECTRICAL_SYSTEM_REGION,BASKET_SAFETY_LOCK_REGION,BASKET_EMPTY_LOAD_REGION,BASKET_CLEANING_OPERATION_REGION
+from globals import basket_suspension_flag,basket_warning_zone_flag,basket_steel_wire_flag,basket_platform_flag,basket_person_flag
+from globals import basket_electrical_system_flag,basket_lifting_flag,basket_safety_lock_flag,basket_safety_belt_flag,basket_empty_load_flag,basket_cleaning_operation_flag,basket_cleaning_up_flag
 
 
 def init_basket_cleaning_detection():
-    # global platform_setup_steps_detect_num,platform_setup_final_result,platform_setup_steps_img
-    # platform_setup_final_result=[0]*14
-    # platform_setup_steps_detect_num=[0]*14
-    # platform_setup_steps_img=[False]*14
-    # redis_client.delete("platform_setup_order")
-    # for i in range(1, 14):
-    #     redis_client.delete(f"platform_setup_{i}")
-    #     redis_client.delete(f"platform_setup_{i}_img")
+    global basket_suspension_flag,basket_warning_zone_flag,basket_steel_wire_flag,basket_platform_flag,basket_electrical_system_flag,basket_lifting_flag,basket_safety_lock_flag,basket_safety_belt_flag,basket_cleaning_up_flag,basket_cleaning_operation_flag,basket_empty_load_flag,basket_person_flag
+    basket_suspension_flag=False
+    basket_warning_zone_flag=False
+    basket_steel_wire_flag=False
+    basket_platform_flag=False
+    basket_electrical_system_flag=False
+    basket_lifting_flag=False
+    basket_safety_lock_flag=False
+    basket_safety_belt_flag=False
+    basket_cleaning_up_flag=False
+    basket_cleaning_operation_flag=False
+    basket_empty_load_flag=False
+    basket_person_flag=False
+    
+    for i in range(1, 12):
+        redis_client.delete(f"basket_step_{i}")
+    redis_client.delete("basket_cleaning_order")
+
     pass
 
 def start_basket_cleaning_detection(start_events):
     threads = []
-    for model_path, video_source in zip(BASKET_CLEANING_VIDEO_SOURCES, BASKET_CLEANING_MODEL_SOURCES):
+    for model_path, video_source in zip(BASKET_CLEANING_MODEL_SOURCES,BASKET_CLEANING_VIDEO_SOURCES):
         event = threading.Event()
         start_events.append(event)
         thread = threading.Thread(target=process_video, args=(model_path, video_source,event))
         threads.append(thread)
         thread.daemon=True
         thread.start()
+        print("吊篮清洗子线程运行中")
 
-    # Wait for all threads to complete
+    # Wait for any threads to complete
     for thread in threads:
         thread.join()
         print("吊篮清洗子线程运行结束")
@@ -43,9 +56,47 @@ def point_in_region(point, region):#判断点是否在多边形内
     is_inside = cv2.pointPolygonTest(region.reshape((-1, 1, 2)), point, False)
     return is_inside >= 0
 
+def save_image_and_redis(redis_client, results, step_name, save_path, post_path):
+
+    save_time = datetime.now().strftime('%Y%m%d_%H%M')
+    imgpath = f"{save_path}/{step_name}_{save_time}.jpg"
+    annotated_frame = results[0].plot()
+    if step_name == "basket_step_2":
+        annotated_frame = cv2.polylines(annotated_frame, [region.reshape(-1, 1, 2) for region in BASKET_SUSPENSION_REGION], isClosed=True, color=(0, 255, 0), thickness=4)
+    elif step_name == "basket_step_3":
+        annotated_frame = cv2.polylines(annotated_frame, [region.reshape(-1, 1, 2) for region in BASKET_STEEL_WIRE_REGION], isClosed=True, color=(0, 255, 0), thickness=4)
+    elif step_name == "basket_step_4":
+        annotated_frame = cv2.polylines(annotated_frame, BASKET_PLATFORM_REGION.reshape(-1, 1, 2), isClosed=True, color=(0, 255, 0), thickness=4)
+    elif step_name == "basket_step_6":
+        annotated_frame = cv2.polylines(annotated_frame, [region.reshape(-1, 1, 2) for region in BASKET_SAFETY_LOCK_REGION], isClosed=True, color=(0, 255, 0), thickness=4)
+    
+    cv2.imwrite(imgpath, annotated_frame)
+    redis_client.set(step_name, post_path)
+    redis_client.rpush("basket_cleaning_order", step_name)
+
+def get_region_mean_color(regions_security_lock_and_work_area, img):
+    for region in regions_security_lock_and_work_area:
+        points = np.array(region, dtype=np.int32)
+        mask = np.zeros(img.shape[:2], dtype=np.uint8)
+        cv2.fillPoly(mask, [points], 255)
+        roi = cv2.bitwise_and(img, img, mask=mask)
+        mean_color = cv2.mean(roi)
+
+        # 将BGR颜色均值再平均
+        average_color_value = sum(mean_color[:3]) / 3
+
+        # 判断平均值是否大于0.30
+        if average_color_value < 0.30:
+            return True
+        else:
+            return False
+
+
 def process_video(model_path, video_source,start_event):
     model = YOLO(model_path)
     cap = cv2.VideoCapture(video_source)
+    
+    #cap.set(cv2.CAP_PROP_BUFFERSIZE, 100)  # 设置缓冲区大小为 10 帧    
     while cap.isOpened():
         if stop_event.is_set():#控制停止推理
             break
@@ -59,29 +110,24 @@ def process_video(model_path, video_source,start_event):
             results = model.predict(frame,conf=0.6,verbose=False)
 
             
-            #悬挂机构区域,分为四个区域
-            SUSPENSION_REGION = np.array([[[668, 310], [800, 310], [800, 1070], [668, 1070]],
-                               [[1690, 310], [1750, 310], [1750, 710], [1690, 710]],
-                               [[1350, 340], [1405, 340], [1405, 720], [1350, 720]],
-                               [[550, 385], [635, 385], [635, 880], [550, 880]]], np.int32)
-            
-            STEEL_WIRE_REGION = np.array([[[0, 0], [0, 0], [0, 0], [0, 0]],[[668, 310], [800, 310], [800, 1070], [668, 1070]],[[0, 0], [0, 0], [0, 0], [0, 0]],[[668, 310], [800, 310], [800, 1070], [668, 1070]]], np.int32)#钢丝绳区域,暂时没有钢丝绳的区域
 
-            global basket_suspension_flag,basket_warning_zone_flag,basket_steel_wire_flag
+
+            global basket_suspension_flag,basket_warning_zone_flag,basket_steel_wire_flag,basket_platform_flag,basket_electrical_system_flag,basket_lifting_flag,basket_safety_lock_flag,basket_safety_belt_flag,basket_cleaning_up_flag,basket_cleaning_operation_flag,basket_empty_load_flag,basket_person_flag
             for r in results:
                 if model_path==BASKET_CLEANING_MODEL_SOURCES[0] and not basket_suspension_flag:#D4悬挂机构
                     boxes=r.boxes.xyxy#人体的检测框
                     keypoints = r.keypoints.xy  
                     confidences = r.keypoints.conf  
                     for i in range(len(boxes)):
-                        left_elbow, right_elbow, left_wrist, right_wrist = keypoints[i][7:11].tolist()#获取左右手腕和左右肘的坐标
-                        points = [left_elbow, right_elbow, left_wrist, right_wrist]
-                        is_inside1 = all(point_in_region(point, SUSPENSION_REGION[0]) for point in points)
-                        is_inside2 = all(point_in_region(point, SUSPENSION_REGION[1]) for point in points)
-                        is_inside3 = all(point_in_region(point, SUSPENSION_REGION[2]) for point in points)
-                        is_inside4 = all(point_in_region(point, SUSPENSION_REGION[3]) for point in points)
+                        left_wrist, right_wrist = keypoints[i][9:11].tolist()#获取左右手腕和左右肘的坐标
+                        points = [left_wrist, right_wrist]
+                        is_inside1 = any(point_in_region(point, BASKET_SUSPENSION_REGION[0]) for point in points)
+                        is_inside2 = any(point_in_region(point, BASKET_SUSPENSION_REGION[1]) for point in points)
+                        is_inside3 = any(point_in_region(point, BASKET_SUSPENSION_REGION[2]) for point in points)
+                        is_inside4 = any(point_in_region(point, BASKET_SUSPENSION_REGION[3]) for point in points)
                         if is_inside1 or is_inside2 or is_inside3 or is_inside4:
                             basket_suspension_flag=True#悬挂机构
+                            print("悬挂机构")
                             
                 elif model_path==BASKET_CLEANING_MODEL_SOURCES[1]:#D5吊篮悬挂
 
@@ -90,6 +136,7 @@ def process_video(model_path, video_source,start_event):
                     classes = r.boxes.cls  
 
                     basket_warning_zone_flag=False#当检测不到则为False
+                    basket_cleaning_up_flag=False
                     for i in range(len(boxes)):
                         x1, y1, x2, y2 = boxes[i].tolist()
                         confidence = confidences[i].item()
@@ -97,24 +144,115 @@ def process_video(model_path, video_source,start_event):
                         label = model.names[cls]
                         if label=='warning_zone':
                             basket_warning_zone_flag=True
+                        elif label=='brush':
+                            basket_cleaning_up_flag=True
+                        # elif label=='person':
+
 
                 elif model_path==BASKET_CLEANING_MODEL_SOURCES[2]:#D6,pose
                     boxes=r.boxes.xyxy#人体的检测框
                     keypoints = r.keypoints.xy  
                     confidences = r.keypoints.conf  
+
+                    basket_person_flag=False#当检测不到则为False
                     for i in range(len(boxes)):
-                        left_elbow, right_elbow, left_wrist, right_wrist = keypoints[i][7:11].tolist()#获取左右手腕和左右肘的坐标
-                        points = [left_elbow, right_elbow, left_wrist, right_wrist]
-                        is_inside1 = all(point_in_region(point, STEEL_WIRE_REGION[0]) for point in points)
-                        is_inside2 = all(point_in_region(point, STEEL_WIRE_REGION[1]) for point in points)
-                        is_inside3 = all(point_in_region(point, STEEL_WIRE_REGION[2]) for point in points)
-                        is_inside4 = all(point_in_region(point, STEEL_WIRE_REGION[3]) for point in points)
-                        if is_inside1 or is_inside2 or is_inside3 or is_inside4:
-                            basket_steel_wire_flag=True#悬挂机构
-            
+                        #当有检测框,则说明有人
+                        basket_person_flag=True
+                        left_wrist, right_wrist = keypoints[i][9:11].tolist()#获取左右手腕和左右肘的坐标
+                        points = [left_wrist, right_wrist]
+                        if not basket_steel_wire_flag:
+                            is_inside1 = any(point_in_region(point, BASKET_STEEL_WIRE_REGION[0]) for point in points)
+                            is_inside2 = any(point_in_region(point, BASKET_STEEL_WIRE_REGION[1]) for point in points)
+                            #is_inside3 = any(point_in_region(point, BASKET_STEEL_WIRE_REGION[2]) for point in points)
+                            #is_inside4 = any(point_in_region(point, BASKET_STEEL_WIRE_REGION[3]) for point in points)
+                            if is_inside1 or is_inside2:
+                                basket_steel_wire_flag=True#钢丝绳
+                                print("钢丝绳")
+                        if not basket_platform_flag:
+                            is_inside = any(point_in_region(point, BASKET_PLATFORM_REGION) for point in points)
+                            if is_inside:
+                                basket_platform_flag=True
+                                print("平台")
+                        if not basket_lifting_flag:
+                            is_inside = any(point_in_region(point, BASKET_LIFTING_REGION) for point in points)
+                            if is_inside:
+                                basket_lifting_flag=True
+                                print("提升机")
+                        if not basket_electrical_system_flag:
+                            is_inside = any(point_in_region(point, BASKET_ELECTRICAL_SYSTEM_REGION) for point in points)
+                            if is_inside:
+                                basket_electrical_system_flag=True
+                                print("电气系统")
+                        if not basket_safety_lock_flag:
+                            is_inside1 = any(point_in_region(point, BASKET_SAFETY_LOCK_REGION[0]) for point in points)
+                            is_inside2 = any(point_in_region(point, BASKET_SAFETY_LOCK_REGION[1]) for point in points)
+                            
+                            if is_inside1 or is_inside2:
+                                basket_safety_lock_flag=True
+                                print("安全锁")
+
+                    if not basket_person_flag and get_region_mean_color([BASKET_EMPTY_LOAD_REGION], frame):
+                        basket_empty_load_flag=True 
+                    
+                else:#d6目标检测
+                    boxes = r.boxes.xyxy  
+                    confidences = r.boxes.conf 
+                    classes = r.boxes.cls  
+
+                    #basket_safety_lock_flag=False#当检测不到则为False
+                    for i in range(len(boxes)):
+                        x1, y1, x2, y2 = boxes[i].tolist()
+                        confidence = confidences[i].item()
+                        cls = int(classes[i].item())
+                        label = model.names[cls]
+                        if label=='safety_belt':
+                            basket_safety_belt_flag=True
+                        elif label=='brush':
+                            is_inside = any(point_in_region(point,BASKET_CLEANING_OPERATION_REGION) for point in points)
+                            if is_inside:
+                                basket_cleaning_operation_flag=True
+
+            if model_path==BASKET_CLEANING_MODEL_SOURCES[0] and not redis_client.exists("basket_step_2") and basket_suspension_flag:#D4悬挂机构 
+                save_image_and_redis(redis_client, results, "basket_step_2", SAVE_IMG_PATH, POST_IMG_PATH5)
+
+            elif model_path==BASKET_CLEANING_MODEL_SOURCES[1]:#D5吊篮悬挂
+                if basket_warning_zone_flag and not redis_client.exists("basket_step_1"):#警戒区
+                    save_image_and_redis(redis_client, results, "basket_step_1", SAVE_IMG_PATH, POST_IMG_PATH5)
+
+                elif basket_cleaning_up_flag and not redis_client.exists("basket_step_11"):
+                    save_image_and_redis(redis_client, results, "basket_step_11", SAVE_IMG_PATH, POST_IMG_PATH5)
+                elif not basket_warning_zone_flag and redis_client.exists("basket_step_1") and not redis_client.exists("basket_step_12"):
+                    save_image_and_redis(redis_client, results, "basket_step_12", SAVE_IMG_PATH, POST_IMG_PATH5)
+                
+            elif model_path==BASKET_CLEANING_MODEL_SOURCES[2]:#D6,pose
+
+
+                if basket_steel_wire_flag and not redis_client.exists("basket_step_3"):
+                    save_image_and_redis(redis_client, results, "basket_step_3", SAVE_IMG_PATH, POST_IMG_PATH5)
+
+                elif basket_platform_flag and not redis_client.exists("basket_step_4"):
+                    save_image_and_redis(redis_client, results, "basket_step_4", SAVE_IMG_PATH, POST_IMG_PATH5)
+
+                elif basket_lifting_flag and not redis_client.exists("basket_step_5"):
+                    save_image_and_redis(redis_client, results, "basket_step_5", SAVE_IMG_PATH, POST_IMG_PATH5)
+
+                elif basket_electrical_system_flag and not redis_client.exists("basket_step_7"):
+                    save_image_and_redis(redis_client, results, "basket_step_7", SAVE_IMG_PATH, POST_IMG_PATH5)
+
+                elif basket_safety_lock_flag and not redis_client.exists("basket_step_6"):
+                    save_image_and_redis(redis_client, results, "basket_step_6", SAVE_IMG_PATH, POST_IMG_PATH5)
+
+                elif basket_empty_load_flag and not redis_client.exists("basket_step_8"):
+                    save_image_and_redis(redis_client, results, "basket_step_8", SAVE_IMG_PATH, POST_IMG_PATH5)
+
+            else:#d6目标检测
 
+                if basket_safety_belt_flag and not redis_client.exists("basket_step_9"):
+                    save_image_and_redis(redis_client, results, "basket_step_9", SAVE_IMG_PATH, POST_IMG_PATH5)
+                elif basket_cleaning_operation_flag and not redis_client.exists("basket_step_10"):
+                    save_image_and_redis(redis_client, results, "basket_step_10", SAVE_IMG_PATH, POST_IMG_PATH5)
 
-                start_event.set()          
+            start_event.set()          
         else:
             # Break the loop if the end of the video is reached
             break

+ 36 - 6
config.py

@@ -9,6 +9,7 @@ POST_IMG_PATH1 = 'http://172.16.20.163:5001/images'  # 通过端口映射post发
 POST_IMG_PATH2 = 'http://172.16.20.163:5002/images' #焊接考核科目2
 POST_IMG_PATH3 = 'http://172.16.20.163:5003/images' #平台搭设科目1,劳保穿戴
 POST_IMG_PATH4 = 'http://172.16.20.163:5004/images' #平台搭设科目2,搭建和拆除
+POST_IMG_PATH5 = 'http://172.16.20.163:5005/images'#吊篮清洗
 
 #焊接考核视频流
 # Define paths to RTSP streams
@@ -99,11 +100,10 @@ PLATFORM_SETUP_MODEL=PLATFORM_CH2_MODEL
 #吊篮清洗
 
 
-BASKET_CLEANING_CH4_POSE_MODEL='/mnt/xcd/code/ai_test/weights/yolov8s-pose.pt'
-BASKET_CLEANING_CH5_DETECT_MODEL='/mnt/xcd/code/ai_test/weights/detect.pt'
-
-BASKET_CLEANING_CH6_POSE_MODEL='/mnt/xcd/code/ai_test/weights/yolov8s-pose.pt'
-BASKET_CLEANING_CH6_DETECT_MODEL='/mnt/xcd/code/ai_test/weights/detect.pt'
+BASKET_CLEANING_CH4_POSE_MODEL='/mnt/xcd/code/ai_test/weights/yolov8s-pose1.pt'
+BASKET_CLEANING_CH5_DETECT_MODEL='/mnt/xcd/code/ai_test/weights/yolov8s1.pt'
+BASKET_CLEANING_CH6_POSE_MODEL='/mnt/xcd/code/ai_test/weights/yolov8s-pose2.pt'
+BASKET_CLEANING_CH6_DETECT_MODEL='/mnt/xcd/code/ai_test/weights/yolov8s2.pt'
 
 BASKET_CLEANING_CH4_RTSP='rtsp://admin:yaoan1234@172.16.22.237/cam/realmonitor?channel=1&subtype=0'
 BASKET_CLEANING_CH5_RTSP='rtsp://admin:yaoan1234@172.16.22.239/cam/realmonitor?channel=1&subtype=0'
@@ -117,4 +117,34 @@ BASKET_CLEANING_VIDEO_SOURCES=[BASKET_CLEANING_CH4_RTSP,
 BASKET_CLEANING_MODEL_SOURCES=[BASKET_CLEANING_CH4_POSE_MODEL,
                                BASKET_CLEANING_CH5_DETECT_MODEL,
                                BASKET_CLEANING_CH6_POSE_MODEL,
-                               BASKET_CLEANING_CH6_DETECT_MODEL]
+                               BASKET_CLEANING_CH6_DETECT_MODEL]
+
+#
+
+#悬挂机构区域,分为四个区域 D4
+BASKET_SUSPENSION_REGION = np.array([
+    [[668, 310], [800, 310], [800, 1070], [668, 1070]],
+    [[1690, 310], [1750, 310], [1750, 710], [1690, 710]],
+    [[1350, 340], [1405, 340], [1405, 720], [1350, 720]],
+    [[550, 385], [635, 385], [635, 880], [550, 880]]
+], np.int32)
+
+BASKET_STEEL_WIRE_REGION = np.array([
+    [(374, 846), (601, 970), (630, 900), (441, 786)],  # 右一多边形区域
+    [(1518, 736), (1649, 945), (2005, 917), (1888, 677)]  # 右二多边形区域
+    # [(1293, 0), (1867, 935), (1904, 906), (1354, 9)],  # 左边多边形区域
+], np.int32)#钢丝绳区域,暂时没有钢丝绳的区域
+
+BASKET_PLATFORM_REGION = np.array([[450, 935], [370, 1275], [1685, 1350], [1600, 720]], np.int32)
+BASKET_LIFTING_REGION = np.array([
+    [[1275, 975], [1270, 1160], [1500, 1160], [1480, 975]],
+    [[570, 1015], [560, 1150], [820, 1190], [832, 1060]]
+],np.int32)
+
+BASKET_SAFETY_LOCK_REGION = np.array([
+    [[1635, 813], [1742, 927], [1955, 910], [1906, 747]],
+    [[650, 944], [800, 1000], [800, 923], [680, 872]]
+    ], np.int32)
+BASKET_ELECTRICAL_SYSTEM_REGION = np.array([[950, 680], [930, 880], [1360, 910], [1250, 660]], np.int32)
+BASKET_CLEANING_OPERATION_REGION = np.array([[668, 310], [800, 310], [800, 1070], [668, 1070]], np.int32)
+BASKET_EMPTY_LOAD_REGION = np.array([(752, 855), (712, 969), (836, 1020), (896, 918)], np.int32)

+ 13 - 3
globals.py

@@ -75,6 +75,16 @@ remove_detection_timers = [time.time()] * 14  # 初始化计时器
 remove_detection_status = [False]*14 # 初始化检
 
 #吊篮清洗
-basket_suspension_flag=False
-basket_warning_zone_flag=False
-basket_steel_wire_flag=False
+basket_person_flag=False#吊篮区域是否存在人员
+basket_suspension_flag=False#吊篮悬挂机构
+basket_warning_zone_flag=False#吊篮警戒区
+basket_steel_wire_flag=False#吊篮钢丝绳
+basket_platform_flag=False#吊篮平台
+basket_lifting_flag=False#吊篮升降机构
+basket_safety_lock_flag=False#吊篮安全锁
+basket_electrical_system_flag=False#吊篮电气系统
+basket_empty_load_flag=False#吊篮空载
+basket_safety_belt_flag=False#吊篮安全带挂设
+
+basket_cleaning_operation_flag=False#吊篮清洗操作,检查刷子是否在指定区域
+basket_cleaning_up_flag=False#吊篮清理现场