| | |
| | | AnalyServerName string `json:"analyServerName"` |
| | | AnalyServerIp string `json:"analyServerIp"` |
| | | ClusterId string `json:"clusterId"` |
| | | LinkId string `json:"linkId"` |
| | | LinkId string `json:"linkId"` |
| | | DetectScore float64 `json:"detectScore"` |
| | | IsAlarm int `json:"isAlarm"` |
| | | IsAckAlarm int `json:"isAckAlarm"` |
| | |
| | | ClusterId string `json:"clusterId"` |
| | | PicSmUrl []string `json:"picSmUrl"` |
| | | PicDate string `json:"picDate"` |
| | | LinkId string `json:"linkId"` |
| | | LinkId string `json:"linkId"` |
| | | VideoUrl string `json:"videoUrl"` |
| | | IsAlarm int `json:"isAlarm"` |
| | | IsAckAlarm int `json:"isAckAlarm"` |
| | |
| | | AlarmLevel string `json:"alarmLevel"` |
| | | RuleText string `json:"ruleText"` |
| | | DefenceState bool `json:"defenceState"` |
| | | } |
| | | |
| | | // 一个face对多个规则组的归置人脸的结构体 |
| | | type FaceAndRules struct { |
| | | ruleserver.Arg |
| | | rules []ruleserver.Result |
| | | } |
| | | |
| | | // 往ES插数据 |
| | |
| | | // //} |
| | | //} |
| | | func InsertToEs(msg ruleserver.ResultMsg) { |
| | | InsertFace(msg,"") |
| | | flag := ruleserver.BodyIsSame(msg.SdkMessage) |
| | | if !flag { |
| | | InsertYolo(msg,"") |
| | | InsertFace(msg, "") |
| | | // 如果标签中含有持续时间首次报警的timeLabel的话则不需要过人体追踪,不然就没的插入了 |
| | | fk := ruleserver.TrackOrNot(msg.RuleResult) |
| | | if fk { |
| | | InsertYolo(msg, "") |
| | | } else { |
| | | flag := ruleserver.BodyIsSame(msg.SdkMessage) |
| | | if !flag { |
| | | InsertYolo(msg, "") |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 往es中插入人脸数据 |
| | | func InsertFace(msg ruleserver.ResultMsg,linkId string) { |
| | | func InsertFace(msg ruleserver.ResultMsg, linkId string) { |
| | | if msg.RuleResult["face"] != nil && len(msg.RuleResult["face"].([]ruleserver.FaceResult)) > 0 { |
| | | logger.Info("往ES插人脸数据") |
| | | for _, faceResult := range msg.RuleResult["face"].([]ruleserver.FaceResult) { |
| | | for _, face := range faceResult.Args { |
| | | faces := PutFace(msg) |
| | | if faces != nil { |
| | | for _,face := range faces { |
| | | // 上传大图 |
| | | // 解压缩并上传图片 |
| | | bdata, err := util.UnCompress(msg.Data) |
| | |
| | | panic("解压缩图片时出现错误") |
| | | } |
| | | alarmRules := []AlarmRule{} |
| | | alarm := ChangeToString(faceResult.DefenceState, faceResult.AlarmLevel) |
| | | alarmRules = append(alarmRules, AlarmRule{faceResult.RuleGroupId, alarm, faceResult.RuleText, faceResult.DefenceState}) |
| | | for _,faceResult := range face.rules { |
| | | alarm := ChangeToString(faceResult.DefenceState, faceResult.AlarmLevel) |
| | | alarmRules = append(alarmRules, AlarmRule{faceResult.RuleGroupId, alarm, faceResult.RuleText, faceResult.DefenceState}) |
| | | } |
| | | i := protomsg.Image{} |
| | | err = proto.Unmarshal(bdata, &i) |
| | | bigPhotoUrl := make(map[string]interface{}) |
| | |
| | | } |
| | | } |
| | | } |
| | | func ChangeStatusFace(msg ruleserver.ResultMsg) { |
| | | logger.Info("往ES插入人脸非报警但是状态转换数据") |
| | | // 上传大图 |
| | | // 解压缩并上传图片 |
| | | bdata, err := util.UnCompress(msg.Data) |
| | | if err != nil { |
| | | panic("解压缩图片时出现错误") |
| | | } |
| | | i := protomsg.Image{} |
| | | err = proto.Unmarshal(bdata, &i) |
| | | bigPhotoUrl := make(map[string]interface{}) |
| | | bigPhotoUrl, err = util.PostFormBufferData(weedfsUrl, i, uuid.NewV4().String()) |
| | | logger.Debug("========大图路径:", bigPhotoUrl) |
| | | // 人脸检测,没有相似的底库人员 |
| | | localConfig, err := cache.GetServerInfo() |
| | | if err != nil { |
| | | logger.Error("查询本机信息失败!") |
| | | } |
| | | serverIp, err := GetLocalIP() |
| | | // 查询cameraName |
| | | camera, err := cache.GetCameraById(msg.Cid) |
| | | if err != nil { |
| | | logger.Error("查询摄像机信息失败") |
| | | } |
| | | |
| | | esDataId := uuid.NewV4().String() |
| | | pervideo := PerVideoPicture{ |
| | | esDataId, |
| | | msg.Cid, |
| | | camera.Addr, |
| | | i.Timestamp, |
| | | strings.Split(bigPhotoUrl["fileUrl"].(string), "/")[1], |
| | | msg.Tasklab.Taskid, |
| | | msg.Tasklab.Taskname, |
| | | "人脸", |
| | | "状态转换数据,非报警数据", |
| | | []AlarmRule{}, |
| | | time.Now().Format("2006-01-02 15:04:05"), // 只检测,没有比对时间 |
| | | "", |
| | | 0, |
| | | "", |
| | | "", |
| | | 0, |
| | | 0, |
| | | "", |
| | | []string{""}, |
| | | "暂无集群", |
| | | localConfig.ServerId, |
| | | localConfig.ServerName, |
| | | serverIp, |
| | | "", |
| | | "", |
| | | 0, |
| | | 1, |
| | | 0, |
| | | 0, |
| | | 0, |
| | | []*ruleserver.BaseInfo{}, |
| | | // 归置人脸 |
| | | func PutFace(msg ruleserver.ResultMsg) []FaceAndRules{ |
| | | if msg.RuleResult["face"] != nil && len(msg.RuleResult["face"].([]ruleserver.FaceResult)) > 0 { |
| | | logger.Info("整理人脸数据") |
| | | faces := []FaceAndRules{} |
| | | for _, faceResult := range msg.RuleResult["face"].([]ruleserver.FaceResult) { |
| | | hebingFace(faces, faceResult) |
| | | } |
| | | return faces |
| | | } |
| | | requstbody, err := json.Marshal(pervideo) |
| | | |
| | | if err != nil { |
| | | logger.Info("json parse error ", err) |
| | | return |
| | | return nil |
| | | } |
| | | func hebingFace(faces []FaceAndRules, faceResult ruleserver.FaceResult) { |
| | | for _, arg := range faceResult.Args { |
| | | // 拿到每一张人脸 |
| | | flag := false |
| | | for _, face := range faces { |
| | | if arg.Id == face.Id { |
| | | flag = true |
| | | face.rules = append(face.rules,faceResult.Result) |
| | | } |
| | | } |
| | | if flag { |
| | | faces = append(faces, FaceAndRules{arg, []ruleserver.Result{faceResult.Result}}) |
| | | } |
| | | } |
| | | resp1, err1 := EsReq("POST", videoPersonUrl, requstbody) |
| | | |
| | | if err1 != nil { |
| | | logger.Error("上传ES出错!---", err1) |
| | | } else { |
| | | logger.Info("插入es返回的信息:", resp1) |
| | | // 发出录像信号 |
| | | ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: esDataId, CameraId: msg.Cid, TaskId: msg.Tasklab.Taskid, ImgId: i.Id, SdkIds: []string{}, Type: 1}) |
| | | } |
| | | //if msg.RuleResult["cacheData"] != nil { |
| | | // InsertFace(msg.RuleResult["cacheData"].(ruleserver.ResultMsg)) |
| | | //} |
| | | } |
| | | |
| | | // 往es中插入yolo数据 |
| | | func InsertYolo(msg ruleserver.ResultMsg,linkId string) { |
| | | func InsertYolo(msg ruleserver.ResultMsg, linkId string) { |
| | | if msg.RuleResult["yolo"] != nil && len(msg.RuleResult["yolo"].([]ruleserver.Result)) > 0 { |
| | | // 先判断一下数据带的规则标签是否有可以插入的 |
| | | flag := false |
| | |
| | | } |
| | | linkFlag := false |
| | | for _, yoloResult := range msg.RuleResult["yolo"].([]ruleserver.Result) { |
| | | if (yoloResult.Others.TimeLabel == "01" || yoloResult.Others.TimeLabel == "10") && yoloResult.Others.LinkCache != nil && len(yoloResult.Others.LinkCache) > 1{ |
| | | if (yoloResult.Others.TimeLabel == "01" || yoloResult.Others.TimeLabel == "10") && yoloResult.Others.LinkCache != nil && len(yoloResult.Others.LinkCache) > 1 { |
| | | linkId := uuid.NewV4().String() |
| | | for _, msg2 := range yoloResult.Others.LinkCache { |
| | | logger.Warn("插入联动数据","此帧数据的id为",msg2.Cid) |
| | | InsertYolo(msg2,linkId) |
| | | logger.Warn("插入联动数据", "此帧数据的id为", msg2.Cid) |
| | | InsertYolo(msg2, linkId) |
| | | linkFlag = true |
| | | } |
| | | } |
| | |
| | | //os.Exit(1) |
| | | } |
| | | } |
| | | func ChangeStatusFace(msg ruleserver.ResultMsg) { |
| | | logger.Info("往ES插入人脸非报警但是状态转换数据") |
| | | // 上传大图 |
| | | // 解压缩并上传图片 |
| | | bdata, err := util.UnCompress(msg.Data) |
| | | if err != nil { |
| | | panic("解压缩图片时出现错误") |
| | | } |
| | | i := protomsg.Image{} |
| | | err = proto.Unmarshal(bdata, &i) |
| | | bigPhotoUrl := make(map[string]interface{}) |
| | | bigPhotoUrl, err = util.PostFormBufferData(weedfsUrl, i, uuid.NewV4().String()) |
| | | logger.Debug("========大图路径:", bigPhotoUrl) |
| | | // 人脸检测,没有相似的底库人员 |
| | | localConfig, err := cache.GetServerInfo() |
| | | if err != nil { |
| | | logger.Error("查询本机信息失败!") |
| | | } |
| | | serverIp, err := GetLocalIP() |
| | | // 查询cameraName |
| | | camera, err := cache.GetCameraById(msg.Cid) |
| | | if err != nil { |
| | | logger.Error("查询摄像机信息失败") |
| | | } |
| | | |
| | | esDataId := uuid.NewV4().String() |
| | | pervideo := PerVideoPicture{ |
| | | esDataId, |
| | | msg.Cid, |
| | | camera.Addr, |
| | | i.Timestamp, |
| | | strings.Split(bigPhotoUrl["fileUrl"].(string), "/")[1], |
| | | msg.Tasklab.Taskid, |
| | | msg.Tasklab.Taskname, |
| | | "人脸", |
| | | "状态转换数据,非报警数据", |
| | | []AlarmRule{}, |
| | | time.Now().Format("2006-01-02 15:04:05"), // 只检测,没有比对时间 |
| | | "", |
| | | 0, |
| | | "", |
| | | "", |
| | | 0, |
| | | 0, |
| | | "", |
| | | []string{""}, |
| | | "暂无集群", |
| | | localConfig.ServerId, |
| | | localConfig.ServerName, |
| | | serverIp, |
| | | "", |
| | | "", |
| | | 0, |
| | | 1, |
| | | 0, |
| | | 0, |
| | | 0, |
| | | []*ruleserver.BaseInfo{}, |
| | | } |
| | | requstbody, err := json.Marshal(pervideo) |
| | | |
| | | if err != nil { |
| | | logger.Info("json parse error ", err) |
| | | return |
| | | } |
| | | resp1, err1 := EsReq("POST", videoPersonUrl, requstbody) |
| | | |
| | | if err1 != nil { |
| | | logger.Error("上传ES出错!---", err1) |
| | | } else { |
| | | logger.Info("插入es返回的信息:", resp1) |
| | | // 发出录像信号 |
| | | ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: esDataId, CameraId: msg.Cid, TaskId: msg.Tasklab.Taskid, ImgId: i.Id, SdkIds: []string{}, Type: 1}) |
| | | } |
| | | //if msg.RuleResult["cacheData"] != nil { |
| | | // InsertFace(msg.RuleResult["cacheData"].(ruleserver.ResultMsg)) |
| | | //} |
| | | } |
| | | |
| | | // 获取本机ip |
| | | func GetLocalIP() (ipv4 string, err error) { |
| | |
| | | } |
| | | return race |
| | | } |
| | | |
| | | |
| | | //for _, faceResult := range msg.RuleResult["face"].([]ruleserver.FaceResult) { |
| | | // for _, face := range faceResult.Args { |
| | | // // 上传大图 |
| | | // // 解压缩并上传图片 |
| | | // bdata, err := util.UnCompress(msg.Data) |
| | | // if err != nil { |
| | | // panic("解压缩图片时出现错误") |
| | | // } |
| | | // alarmRules := []AlarmRule{} |
| | | // alarm := ChangeToString(faceResult.DefenceState, faceResult.AlarmLevel) |
| | | // alarmRules = append(alarmRules, AlarmRule{faceResult.RuleGroupId, alarm, faceResult.RuleText, faceResult.DefenceState}) |
| | | // i := protomsg.Image{} |
| | | // err = proto.Unmarshal(bdata, &i) |
| | | // bigPhotoUrl := make(map[string]interface{}) |
| | | // bigPhotoUrl, err = util.PostFormBufferData(weedfsUrl, i, uuid.NewV4().String()) |
| | | // logger.Debug("========大图路径:", bigPhotoUrl) |
| | | // // 人脸检测,没有相似的底库人员 |
| | | // localConfig, err := cache.GetServerInfo() |
| | | // if err != nil { |
| | | // logger.Error("查询本机信息失败!") |
| | | // } |
| | | // serverIp, err := GetLocalIP() |
| | | // // 查询cameraName |
| | | // camera, err := cache.GetCameraById(msg.Cid) |
| | | // if err != nil { |
| | | // logger.Error("查询摄像机信息失败") |
| | | // } |
| | | // bytes := util.SubImg(i, int(face.Location.X), int(face.Location.Y), int(face.Location.X+face.Location.Width), int(face.Location.Y+face.Location.Height)) |
| | | // resp, err := util.PostFormBufferData1(weedfsUrl, bytes, uuid.NewV4().String()) |
| | | // if err != nil { |
| | | // logger.Error("上传小图出错") |
| | | // } |
| | | // logger.Info("================小图地址:", resp["fileUrl"].(string)) |
| | | // sex := "" |
| | | // if face.ThftRes.Gender == 1 { |
| | | // sex = "男" |
| | | // } else { |
| | | // sex = "女" |
| | | // } |
| | | // race := getRaceString(face.ThftRes.Race) |
| | | // ageDescription := getDescription(face.ThftRes.Age) |
| | | // esDataId := uuid.NewV4().String() |
| | | // linksId := "" |
| | | // if linkId != "" { |
| | | // linksId = linkId |
| | | // } |
| | | // pervideo := PerVideoPicture{ |
| | | // esDataId, |
| | | // msg.Cid, |
| | | // camera.Addr, |
| | | // i.Timestamp, |
| | | // strings.Split(bigPhotoUrl["fileUrl"].(string), "/")[1], |
| | | // msg.Tasklab.Taskid, |
| | | // msg.Tasklab.Taskname, |
| | | // "人脸", |
| | | // "", |
| | | // alarmRules, |
| | | // time.Now().Format("2006-01-02 15:04:05"), // 只检测,没有比对时间 |
| | | // sex, |
| | | // face.ThftRes.Age, |
| | | // ageDescription, |
| | | // race, |
| | | // face.ThftRes.Smile, |
| | | // face.ThftRes.Beauty, |
| | | // base64.StdEncoding.EncodeToString(face.Feature), |
| | | // []string{strings.Split(resp["fileUrl"].(string), "/")[1]}, |
| | | // "暂无集群", |
| | | // localConfig.ServerId, |
| | | // localConfig.ServerName, |
| | | // serverIp, |
| | | // "", |
| | | // linksId, |
| | | // face.Score, |
| | | // 1, |
| | | // 0, |
| | | // 0, |
| | | // 0, |
| | | // face.Liker, |
| | | // } |
| | | // requstbody, err := json.Marshal(pervideo) |
| | | // |
| | | // if err != nil { |
| | | // logger.Info("json parse error ", err) |
| | | // return |
| | | // } |
| | | // resp1, err1 := EsReq("POST", videoPersonUrl, requstbody) |
| | | // if err1 != nil { |
| | | // logger.Error("上传ES出错!---", err1) |
| | | // } else { |
| | | // logger.Info("插入es返回的信息:", resp1) |
| | | // // 发出录像信号 |
| | | // ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: esDataId, CameraId: msg.Cid, TaskId: msg.Tasklab.Taskid, ImgId: i.Id, SdkIds: []string{}, Type: 1}) |
| | | // } |
| | | // } |
| | | //} |
| | |
| | | logger.Info("--------------追踪之后yolo的个数:",len(faceParam.Faces)) |
| | | for _, info := range faceParam.Faces { |
| | | //logger.Info("_______________________________________________第一次看相似值:",info.Pos.FAngle.Confidence*100) |
| | | photoMap := ruleserver.PhotoMap{Rects: rectFormat(info.Pos.RcFace), Score: float64(info.Pos.FAngle.Confidence*100), IsYolo:false,ThftRes:*(info.Result),Feature:info.Feats} |
| | | photoMap := ruleserver.PhotoMap{Id:info.Pos.FaceID,Rects: rectFormat(info.Pos.RcFace), Score: float64(info.Pos.FAngle.Confidence*100), IsYolo:false,ThftRes:*(info.Result),Feature:info.Feats} |
| | | arg.Photo = append(arg.Photo, photoMap) |
| | | } |
| | | args.Sdkdata = append(args.Sdkdata,&arg) |
| | |
| | | logger.Debug("---------------------------------追踪结束--------------------------------------") |
| | | return false |
| | | } |
| | | func TrackOrNot(label map[string]interface{}) bool{ |
| | | if label["yolo"] != nil && len(label["yolo"].([]Result)) > 0 { |
| | | for _,res := range label["yolo"].([]Result) { |
| | | if res.TimeLabel == "10" { |
| | | return true |
| | | } |
| | | } |
| | | } |
| | | return false |
| | | } |
| | | |
| | | // 过滤掉那些已在缓存中且分值更低的人脸,更新缓存(没有的加上,分值更新为更高的,多的删除) |
| | | func FaceIsInPond(cameraId string, sdkinfor *protomsg.SdkmsgWithTask) string { |
| | |
| | | if threshold <= obj.Score && size <= float64(obj.Rects.Width*obj.Rects.Height) && intersectionper <= PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale) { |
| | | // 这步要备齐表达式里所需要的所有参数 |
| | | a.targetNum++ |
| | | arg1 := Arg{obj.Score, PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale), float64(obj.Rects.Width * obj.Rects.Height), obj.IsYolo, obj.Rects, obj.Feature, obj.ThftRes, []*BaseInfo{}} |
| | | arg1 := Arg{obj.Id,obj.Score, PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale), float64(obj.Rects.Width * obj.Rects.Height), obj.IsYolo, obj.Rects, obj.Feature, obj.ThftRes, []*BaseInfo{}} |
| | | //logger.Println("放进去的arg:-------", arg1) |
| | | a.args = append(a.args, &arg1) |
| | | a.filterData = append(a.filterData, &arg1) |
| | |
| | | |
| | | // 每个目标的参数:相似度,占比,尺寸 |
| | | type Arg struct { |
| | | Id uint64 |
| | | Score float64 // 区域内的目标的相似度 |
| | | Proportion float64 // 区域内的目标的占比 |
| | | Size float64 // 区域内的目标的尺寸 |
| | |
| | | |
| | | // sdk输出的图片上单个目标的数据 |
| | | type PhotoMap struct { |
| | | Id uint64 |
| | | Rects Rect // 矩形区域参数 |
| | | Score float64 // 相似度得分(有多大程度像一个目标。人脸,人体或车等等) |
| | | IsYolo bool // 是否是yolo数据 |
| | |
| | | LinkCache []ResultMsg |
| | | TimeLabel string |
| | | } |
| | | |
| | | // 过规则库打上的标签 |
| | | type FaceResult struct { |
| | | Result |
| | | Args []Arg |
| | | Args []Arg |
| | | } |
| | | type LittleRuleResult struct { |
| | | SdkName string // 记录下此结果是哪个sdk的结果 |
| | |
| | | if len(temp) > 0 { |
| | | if group.SetType != "linkTask" { |
| | | // 独立任务的处理 |
| | | RunRule(args, group, taskId, message,label) |
| | | RunRule(args, group, taskId, message, label) |
| | | } |
| | | } |
| | | } |
| | |
| | | if len(temp) > 0 { |
| | | if group.SetType == "linkTask" { |
| | | // groupId中含有link则为联动任务 |
| | | LinkTask(args, group, taskId, message,label) |
| | | LinkTask(args, group, taskId, message, label) |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | func RunRule(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage,label Others) bool { |
| | | func RunRule(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage, label Others) bool { |
| | | defer func() { |
| | | if err := recover(); err != nil { |
| | | logger.Error("比对规则有误", err.(string)) |
| | |
| | | if completeFormula != "" { |
| | | logger.Info("结果公式-----------:", completeFormula) |
| | | expression, err := govaluate.NewEvaluableExpression(completeFormula) |
| | | if strings.HasPrefix(completeFormula, "&&") || strings.HasPrefix(completeFormula, "||") || err != nil{ |
| | | if strings.HasPrefix(completeFormula, "&&") || strings.HasPrefix(completeFormula, "||") || err != nil { |
| | | panic("规则有误,得到的数学公式不可解析") |
| | | } |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | |
| | | for _, sdkData := range args.Sdkdata { |
| | | if sdkData.IpcId == "A8B73405-373D-4F23-CED2-A617EBD7EC55" && faceFlag { // sdkData里有人脸数据且配置了算法才把符合条件的数据塞进标签里去 |
| | | for _, areaMap := range sdkData.AreaMapList { |
| | | faces = append(faces, putFaceToResult(areaMap,faces)...) |
| | | faces = append(faces, putFaceToResult(areaMap, faces)...) |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | //logger.Debug("------locations的内容:", locations) |
| | | if sdkNames != "" { |
| | | args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkNames, groupRule.GroupId,groupRule.DefenceState,groupRule.AlarmLevel, groupRule.GroupText, locations, polygonId,label}) |
| | | args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, locations, polygonId, label}) |
| | | //logger.Info("-------------------yolo结果标签长度", len(args.RuleResult["yolo"].([]Result))) |
| | | } |
| | | if faceFlag { |
| | | args.RuleResult["face"] = append(args.RuleResult["face"].([]FaceResult), FaceResult{Result{taskId, sdkNames, groupRule.GroupId,groupRule.DefenceState,groupRule.AlarmLevel, groupRule.GroupText, []Rect{}, polygonId,label},faces}) |
| | | args.RuleResult["face"] = append(args.RuleResult["face"].([]FaceResult), FaceResult{Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, []Rect{}, polygonId, label}, faces}) |
| | | //logger.Info("-------------------face结果标签", len(args.RuleResult["face"].([]FaceResult))) |
| | | } |
| | | return true |
| | |
| | | } |
| | | } |
| | | |
| | | func putFaceToResult(am *AreaMap,faceList []Arg) []Arg { |
| | | func putFaceToResult(am *AreaMap, faceList []Arg) []Arg { |
| | | faces := []Arg{} |
| | | if len(am.filterData) > 0 { |
| | | for _, data := range am.filterData { |
| | | flag := true |
| | | for _,face := range faceList { |
| | | for _, face := range faceList { |
| | | if data.Location.X == face.Location.X && data.Location.Y == face.Location.Y && data.Location.Width == face.Location.Width && data.Location.Height == face.Location.Height { |
| | | flag = false |
| | | } |
| | |
| | | } |
| | | |
| | | // 联动任务的处理 |
| | | func LinkTask(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage,label Others) { |
| | | func LinkTask(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage, label Others) { |
| | | // new一个定时器,如果以此groupId为标志的定时器不存在的话 |
| | | logger.Info("------------------------------------------当前是联动任务,规则是:", groupRule.GroupText) |
| | | var flag bool = true |
| | |
| | | } |
| | | } |
| | | if flag1 { |
| | | TimeEleList[groupRule.GroupId].RuleResults = append(TimeEleList[groupRule.GroupId].RuleResults, &RuleResult{groupRule.Rules[j].CameraId, groupRule.Rules[j].Sort, "", groupRule.Rules[j].RuleWithPre,ResultMsg{}}) |
| | | TimeEleList[groupRule.GroupId].RuleResults = append(TimeEleList[groupRule.GroupId].RuleResults, &RuleResult{groupRule.Rules[j].CameraId, groupRule.Rules[j].Sort, "", groupRule.Rules[j].RuleWithPre, ResultMsg{}}) |
| | | } |
| | | } |
| | | } |
| | | // 往数组里赋值 |
| | | isOk := RunRule(args, groupRule, taskId, message,label) |
| | | isOk := RunRule(args, groupRule, taskId, message, label) |
| | | if isOk { |
| | | logger.Info("这帧图像在任务下的一整条规则下(联动任务下就是跟本摄像机像相关的小规则)的判断结果为true") |
| | | // 根据cameraId去更新或者插入结果,然后判断是否数组是否可以得出报警的结论 |
| | |
| | | if va.CameraId == args.CameraId { |
| | | va.Result = strconv.FormatBool(isOk) |
| | | tempMap := make(map[string]interface{}) |
| | | for k,result := range args.RuleResult { |
| | | for k, result := range args.RuleResult { |
| | | if k == "yolo" { |
| | | tempMap[k] = []Result{} |
| | | for _,res := range result.([]Result) { |
| | | tempMap[k] = append(tempMap[k].([]Result),res) |
| | | for _, res := range result.([]Result) { |
| | | tempMap[k] = append(tempMap[k].([]Result), res) |
| | | } |
| | | } |
| | | if k == "face" { |
| | | tempMap[k] = []FaceResult{} |
| | | for _,res := range result.([]FaceResult) { |
| | | tempMap[k] = append(tempMap[k].([]FaceResult),res) |
| | | for _, res := range result.([]FaceResult) { |
| | | tempMap[k] = append(tempMap[k].([]FaceResult), res) |
| | | } |
| | | } |
| | | } |
| | | va.CacheData = ResultMsg{message,tempMap} |
| | | va.CacheData = ResultMsg{message, tempMap} |
| | | logger.Info("这个摄像机--", args.CameraId, "--被赋予了result", va.Result) |
| | | } |
| | | } |
| | |
| | | // 把数组里缓存的数据取出来一起报警 |
| | | label.LinkCache = []ResultMsg{} |
| | | for _, ruleRes := range TimeEleList[groupRule.GroupId].RuleResults { |
| | | label.LinkCache = append(label.LinkCache,ruleRes.CacheData) |
| | | label.LinkCache = append(label.LinkCache, ruleRes.CacheData) |
| | | } |
| | | logger.Debug("联动任务缓存了几个数据",len(label.LinkCache)) |
| | | for i := 0; i < len(args.RuleResult["yolo"].([]Result)); i++ { |
| | | logger.Debug("联动任务缓存了几个数据", len(label.LinkCache)) |
| | | for i := 0; i < len(args.RuleResult["yolo"].([]Result)); i++ { |
| | | if args.RuleResult["yolo"].([]Result)[i].RuleGroupId == groupRule.GroupId { // 把联动数据追加上 |
| | | args.RuleResult["yolo"].([]Result)[i].Others.LinkCache = label.LinkCache |
| | | } |
| | | } |
| | | for i := 0; i < len(args.RuleResult["face"].([]FaceResult)); i++ { |
| | | for i := 0; i < len(args.RuleResult["face"].([]FaceResult)); i++ { |
| | | if args.RuleResult["face"].([]FaceResult)[i].RuleGroupId == groupRule.GroupId { // 把联动数据追加上 |
| | | args.RuleResult["face"].([]FaceResult)[i].Others.LinkCache = label.LinkCache |
| | | } |
| | |
| | | // va.Result = strconv.FormatBool(isOk) |
| | | // } |
| | | //} |
| | | for k,_ := range TimeEleList { |
| | | for k, _ := range TimeEleList { |
| | | if k == groupRule.GroupId { |
| | | delete(TimeEleList,k) |
| | | delete(TimeEleList, k) |
| | | logger.Debug("因为定时器的一帧数据结果为false,干掉定时器") |
| | | } |
| | | } |
| | |
| | | am.targetNum = len(am.filterData) // 把符合条件的目标数量更新到targetNum字段 |
| | | } |
| | | if am.targetNum > 0 { |
| | | logger.Info("!!!!!!!!!人脸检测成功") |
| | | logger.Info("!!!!!!!!!人脸检测成功") |
| | | return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "true", rule.Sort} |
| | | } else { |
| | | return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "false", rule.Sort} |