| | |
| | | "time" |
| | | ) |
| | | |
| | | func Entrance (args *structure.SdkDatas,groupRule protomsg.GroupRule,lable *structure.Others,message *protomsg.SdkMessage) (bool,[]*structure.Arg,string,string){ |
| | | func Entrance (args *structure.SdkDatas,groupRule protomsg.GroupRule,lable *structure.Others,message *protomsg.SdkMessage) (bool,string,string){ |
| | | resultSplice := []*structure.LittleRuleResult{} |
| | | sdkNames := "" |
| | | polygonId := "" |
| | |
| | | } |
| | | // 个体静止 |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | | if groupRule.Rules[j].SdkId == "个体静止" && groupRule.Rules[j].SdkArgAlias != "time_rule"{ |
| | | if groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a977" && groupRule.Rules[j].SdkArgAlias != "time_rule"{ |
| | | for _, sdkData := range args.Sdkdata { |
| | | // 根据规则的sdkId查出其对应的ipcId,用ipcId去找该比对的数据 |
| | | sdk, err := cache.GetSdkById(groupRule.Rules[j].SdkId) |
| | |
| | | panic("规则有误,得到的数学公式不可解析") |
| | | } |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | | return result.(bool),nil,sdkNames,polygonId |
| | | return result.(bool),sdkNames,polygonId |
| | | } else { |
| | | return false,nil,sdkNames,polygonId |
| | | return false,sdkNames,polygonId |
| | | } |
| | | } |
| | | |
| | |
| | | soName = "personUnsual.so" |
| | | } else if sdkId == "812b674b-2375-4589-919a-5c1c3278a972" { |
| | | soName = "faceCompare.so" |
| | | } else if sdkId == "个体静止" { |
| | | } else if sdkId == "812b674b-2375-4589-919a-5c1c3278a977" { |
| | | soName = "static.so" |
| | | } else if sdkId == "812b674b-2375-4589-919a-5c1c3278a978" { |
| | | soName = "car.so" |
| | | } |
| | | //soInfo,errr := cache.GetSoInfoById(sdkId) |
| | | //if errr != nil { |
| | |
| | | return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort} |
| | | } else { |
| | | flag := "false" |
| | | // 以之前静止的对象为主判断是否静止 |
| | | tars := []*structure.Arg{} |
| | | for _, tar := range structure.StaticMap[am.AreaId].Targets { |
| | | singleResult := SingleStatic(tar,am,lable,90) |
| | | singleResult,arg := SingleStatic(tar,am,lable,90) |
| | | if singleResult { |
| | | flag = "true" |
| | | tars = append(tars,arg) |
| | | } |
| | | } |
| | | // 把满足条件的目标放进areaMap中 |
| | | am.AlarmObj = tars |
| | | // 更新数据,把新来的数据写入缓存 |
| | | objs := []*structure.Obj{} |
| | | for _, tar := range am.FilterData { |
| | |
| | | } |
| | | |
| | | // 判断一个目标是否静止了指定时间 |
| | | func SingleStatic(person *structure.Obj, am *structure.AreaMap,lable *structure.Others, argValue float64) bool{ |
| | | func SingleStatic(person *structure.Obj, am *structure.AreaMap,lable *structure.Others, argValue float64) (bool,*structure.Arg){ |
| | | flag := false |
| | | var o *structure.Arg = nil |
| | | for _, obj := range am.FilterData { |
| | | if person.Id == obj.Id { |
| | | coincidenceDegree := PgsInterPercent(Rect2Point(person.Location), obj.Location, 1, 1) |
| | | o = obj |
| | | if coincidenceDegree >= argValue { |
| | | flag = true |
| | | } |
| | |
| | | if flag { // 有一个对象保持静止(id相等并且重合度高于阈值) |
| | | flagTime := TimerAlarm(lable,person,flag,am.AreaId) |
| | | if flagTime == "10" || flagTime == "11" { |
| | | return flag |
| | | return flag,o |
| | | } else { |
| | | return false |
| | | return false,o |
| | | } |
| | | } else { |
| | | TimerAlarm(lable,person,flag,am.AreaId) |
| | | return flag |
| | | return flag,o |
| | | } |
| | | } |
| | | var rw sync.RWMutex |
| | |
| | | if obj.Score >= threshold && float64(obj.Rects.Width*obj.Rects.Height) >= size && PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale) >= intersectionper { |
| | | // 这步要备齐表达式里所需要的所有参数 |
| | | a.TargetNum++ |
| | | arg1 := structure.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, []*structure.BaseInfo{},nil} |
| | | arg1 := structure.Arg{obj.Id,obj.Score, PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale), float64(obj.Rects.Width * obj.Rects.Height), a.AreaJson,obj.IsYolo, obj.Rects, obj.Feature, obj.ThftRes, []*structure.BaseInfo{},nil} |
| | | //logger.Println("放进去的arg:-------", arg1) |
| | | a.Args = append(a.Args, &arg1) |
| | | a.FilterData = append(a.FilterData, &arg1) |
| | |
| | | } |
| | | logger.Info("区域是:",areaPoints,"区域内目标数量为:",a.TargetNum,"---",len(a.FilterData)) |
| | | a.Time = time.Unix(time.Now().Unix(), 0).String()[11:16] |
| | | a.KeepRight = arg.KeepRight |
| | | a.IsStatic = arg.IsStatic |
| | | //logger.Println("--------------------看看区域数据:",*a) |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | func CallMiddleware(args *structure.SdkDatas,rule protomsg.GroupRule,lable *structure.Others,message *protomsg.SdkMessage) (bool, []*structure.Arg, string, string){ |
| | | func CallMiddleware(args *structure.SdkDatas,rule protomsg.GroupRule,lable *structure.Others,message *protomsg.SdkMessage) (bool, string, string){ |
| | | p,err := plugin.Open("./algorithm/middleware.so") |
| | | if err != nil { |
| | | panic(err) |
| | |
| | | if err1 != nil { |
| | | panic("没有找到中间件入口函数") |
| | | } |
| | | a,b,c,d := f.(func(args *structure.SdkDatas,rule protomsg.GroupRule,label *structure.Others,message *protomsg.SdkMessage)(bool,[]*structure.Arg, string, string))(args,rule,lable,message) |
| | | return a,b,c,d |
| | | a,b,c := f.(func(args *structure.SdkDatas,rule protomsg.GroupRule,label *structure.Others,message *protomsg.SdkMessage)(bool,string, string))(args,rule,lable,message) |
| | | return a,b,c |
| | | } |
| | | |
| | | func RunRule(args *structure.SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage, label structure.Others) (bool,[]int) { |
| | |
| | | polygonId := "" |
| | | targets := []*structure.Arg{} // 符合条件的目标 |
| | | // 把一帧数据和一组规则发给算法部分,得出判断结果 |
| | | result,targets,sdkNames,polygonId = CallMiddleware(args,*groupRule,&label,message) |
| | | logger.Info("符合条件的目标数据:",targets) |
| | | result,sdkNames,polygonId = CallMiddleware(args,*groupRule,&label,message) |
| | | for _, sdkData := range args.Sdkdata { |
| | | for _, areaMap := range sdkData.AreaMapList { |
| | | targets = append(targets,areaMap.AlarmObj...) |
| | | for _,obj := range areaMap.AlarmObj { |
| | | logger.Info("个体静止的目标",obj.Id,obj.Location) |
| | | } |
| | | } |
| | | } |
| | | //logger.Info("符合条件的目标数据:",targets) |
| | | if result { |
| | | // 最后过持续时间等时间维度的条件 把时间规则位置调整到这个位置是为了缓存数据 !!!!!ps: 对画面中单个目标做定时器的不用再过画面定时器 |
| | | cacheId := "" |
| | |
| | | Score float64 // 区域内的目标的相似度 |
| | | Proportion float64 // 区域内的目标的占比 |
| | | Size float64 // 区域内的目标的尺寸 |
| | | AreaJson string // 所属区域 |
| | | IsYolo bool // 是否是yolo数据 |
| | | Location Rect // 记下每个目标的位置参数,最后给结果装配人脸数据的时候用的到 |
| | | Feature []byte |
| | |
| | | TargetNum int // 区域内目标数量 |
| | | Args []*Arg // 区域内目标集合 |
| | | FilterData []*Arg // 过滤后区域内目标集合 |
| | | AlarmObj []*Arg // 区域内最后满足规则的目标 |
| | | Time string // 当前时间(用以匹配时间规则) |
| | | IsEffective bool // 规则中是否用到了此区域 |
| | | KeepRight bool // 是否靠右行 |
| | | IsStatic bool // 是否静止 |
| | | } |
| | | |
| | | // sdk输出的图片上单个目标的数据 |