Пример #1
0
    def on_function(self, data):
        # 目前该function仅用于TD201/202
        # 阵列和盒子等代理使用function batch和function cam,其中function cam应该废弃变成function
        logging.info("function setting: {}".format(data))

        msg_id = data.pop("msg_id", "")
        func_name = data.pop("func_name")

        if device.is_edge_ipc():
            cam = device.get_edge_ipc_cam()
        elif "device_id" in data:
            cam = camctl.get_one(data["device_id"])
        else:
            logging.info("unexpected function setting got: %s", data)
            self.report_function(msg_id)
            return
        cam_function = cam.function
        if cam_function and func_name in cam_function:
            for k, v in data.items():
                cam_function[func_name][k] = v

            logging.info("change cam {} function: {}".format(
                cam.uuid, cam_function))
            camctl.update(cam.uuid, {"function": cam_function})
        self.report_function(msg_id, data.pop("device_id", None))
Пример #2
0
    def on_cam_setting(self, data):
        """
        普通摄像头更新设置
        """
        logging.info("change cam setting: {}".format(data))

        msg_id = data.pop("msg_id")
        cam_uuid = data.pop("cam_uuid")

        camctl.update(cam_uuid, data)
        self.report_cam_setting(cam_uuid=cam_uuid, msg_id=msg_id)
Пример #3
0
 def do_put(self, data):
     """ overwrite all function settings of a specific camera """
     device_id = data.get("device_id")
     new_setting = data.get("function")
     try:
         if not isinstance(new_setting, dict):
             raise RuntimeError("invalid parameters")
         camctl.update(device_id, {"function": new_setting})
         cam = camctl.get_one(device_id)
     except Exception as err:
         logging.exception(err)
         return self.failed(500, "{}".format(err))
     return self.success(cam.function)
Пример #4
0
    def on_function_batch(self, data):
        """
        批量更新边侧摄像头某种类型的告警设置
        """
        logging.info("function batch setting: {}".format(data))

        msg_id = data["msg_id"]
        func_name = data["func_name"]
        enable = data["enable"]
        aggreagate = data["aggreagate"]
        device_ids = data["device_ids"]
        update_server = data["update_server"]

        desc = "success"
        if update_server:
            # 修改function表的设置
            function = functl.get(func_name)
            if function:
                function["enable"] = enable
                function["aggreagate"] = aggreagate
                functl.update_all({func_name: function})
            else:
                desc = "func_name {} not support".format(func_name)

        # 依次处理每个设备
        for device_id in device_ids:
            cam_info = camctl.get_one(device_id)
            function = cam_info.function
            one_function = function.get(func_name)
            if one_function:
                one_function["enable"] = enable
                one_function["aggreagate"] = aggreagate
                function[func_name] = one_function
                camctl.update(device_id, {"function": function})
            else:
                if desc == "success":
                    desc = ""
                desc += "device {} not support func_name {}".format(
                    device_id, func_name)

        resp_data = {
            "msg_id": msg_id,  # 带着上面的msgId
            "desc": desc  # success表示成功,失败传原因
        }
        self.publish(Cloud.topic_pub_function_batch, resp_data)
Пример #5
0
    def on_function_cam(self, data):
        """
        全量更新摄像头的告警设置
        """
        logging.info("function cam setting: {}".format(data))

        msg_id = data["msg_id"]
        function = data["function"]
        device_ids = data["device_ids"]

        for device_id in device_ids:
            cam_function = camctl.get_one(device_id).function
            for func_name in cam_function:
                if func_name in function:
                    cam_function[func_name] = function[func_name]
            logging.info("change cam {} function: {}".format(
                device_id, cam_function))
            camctl.update(device_id, {"function": cam_function})

        self.report_function_cam(device_ids, msg_id)
Пример #6
0
    def do_post(self, data):
        """ modify part of function settings of a specific camera """
        device_id = data.get("device_id")
        func_name = data.get("func_name")
        enable = data.get("enable", False)
        zones = data.get("zones", [[]])
        reverse = data.get("reverse", False)
        threshold = data.get("threshold", 0.2)
        detection_cycle = data.get(
            "detection_cycle", {
                "detection_starttime": 0,
                "detection_endtime": 64800,
                "detection_period": [0, 1, 2, 3, 4, 5, 6],
            })
        _, _, ts = clock.now()
        detected_time = [ts] * len(zones)

        try:
            cam = camctl.get_one(device_id)
            if func_name not in functl.get(""):
                raise RuntimeError("invalid function id")
            if not isinstance(zones, list):
                raise RuntimeError("invalid parameters")

            all_function = cam.function
            function_spec = all_function.get(func_name, {})
            function_spec["enable"] = enable
            function_spec["zone"] = zones
            function_spec["reverse"] = reverse
            function_spec["threshold"] = threshold
            function_spec["detection_cycle"] = detection_cycle
            function_spec["detected_time"] = detected_time
            all_function[func_name] = function_spec
            camctl.update(device_id, {"function": all_function})
            cam = camctl.get_one(device_id)
        except Exception as err:
            logging.exception(err)
            return self.failed(500, "{}".format(err))
        return self.success(cam.function)
Пример #7
0
    def __call__(self, raw_results, cam):
        # leave filter
        cam_function = cam.function
        cam_info = cam_function.get(self.func_name, {})
        cam_reverse = cam_info.get("reverse", False)
        aggreagate_time = functl.get(self.func_name).get("aggreagate", 300)
        filter_results = []
        if cam_info.get("enable", False):
            logging.info("_apply_{}_filter:: filtering...".format(
                self.func_name))
            cam_zones = cam_info.get("zones", [])
            cam_detected_times = cam.detected_times
            _, _, ts = clock.now()
            if cam_zones == []:
                logging.info("apply_{}_filter:: zones: whole img".format(
                    self.func_name))
                logging.info(
                    "last detected time is:: {}, current time is:: {}".format(
                        clock._get_csttz_dt(cam_detected_times[0]),
                        clock._get_csttz_dt(ts)))
                detected_flag = False
                for result in raw_results:
                    if result[0] == 'person_body':
                        detected_flag = True
                if detected_flag:
                    cam_detected_times = [ts]
                    camctl.update(cam.uuid,
                                  {"detected_times": cam_detected_times})
                else:
                    if (ts - cam_detected_times[0]) > aggreagate_time:
                        return_result = ["leave", 0.666, "0", "0", "1", "1"]
                        filter_results.append(return_result)
            else:
                logging.info("_apply_{}_filter:: zones: {}".format(
                    self.func_name, cam_zones))
                if len(cam_detected_times) != len(cam_zones):
                    cam_detected_times = [ts] * len(cam_zones)

                for result in raw_results:
                    in_flag = False
                    in_index = -1
                    if result[0] == "person_body":
                        left_leg_x = int(result[2])
                        right_leg_x = int(result[4])
                        leg_y = int(result[5])
                        check_point = {
                            "x": int((left_leg_x + right_leg_x) / 2),
                            "y": leg_y
                        }
                        for i, zone in enumerate(cam_zones):
                            check_point_inside = _isInsidePolygon(
                                check_point, zone)
                            if check_point_inside:
                                in_flag = True
                                in_index = i
                        if in_flag:
                            cam_detected_times[in_index] = ts
                camctl.update(cam.uuid, {"detected_times": cam_detected_times})
                for i, zone in enumerate(cam_zones):
                    detected_time = cam_detected_times[i]
                    logging.info(
                        "zone {} @ last detected time is:: {}, current time is:: {}"
                        .format(i, clock._get_csttz_dt(detected_time),
                                clock._get_csttz_dt(ts)))
                    if (ts - detected_time) > aggreagate_time:
                        xmin = str(zone[0]["x"])
                        ymin = str(zone[0]["y"])
                        xmax = str(zone[2]["x"])
                        ymax = str(zone[2]["y"])
                        return_result = [
                            "leave", 0.666, xmin, ymin, xmax, ymax
                        ]
                        filter_results.append(return_result)
                        """
                        if cam_reverse:
                            if not in_flag:
                                filter_results.append(result)
                        else:
                            if in_flag:
                                filter_results.append(result)
                        """

        logging.info("_apply_{}_filter:: results: {}".format(
            self.func_name, filter_results))
        parse_results = reslove_result(filter_results, self.func_name)
        return parse_results