| | |
| | | import ( |
| | | "encoding/json" |
| | | "errors" |
| | | uuid "github.com/satori/go.uuid" |
| | | "net" |
| | | "strconv" |
| | | "time" |
| | | |
| | | "nanomsg.org/go-mangos" |
| | | "nanomsg.org/go-mangos/protocol/req" |
| | | "nanomsg.org/go-mangos/transport/tcp" |
| | | "github.com/knetic/govaluate" |
| | | logger "github.com/alecthomas/log4go" |
| | | "basic.com/valib/logger.git" |
| | | |
| | | "basic.com/pubsub/protomsg.git" |
| | | "ruleprocess/structure" |
| | |
| | | // 给目标填充liker |
| | | func fillLiker(compareThreshold float32,arg *structure.Arg,am *structure.AreaMap) { |
| | | trackArg := make(map[string]interface{}) |
| | | trackArg["esId"] = "" |
| | | esId := uuid.NewV4().String() |
| | | trackArg["esId"] = esId |
| | | trackArg["threshold"] = compareThreshold |
| | | trackArg["cameraId"] = am.CameraId |
| | | trackArg["bodyFeature"] = arg.Feature |
| | | trackArg["faceFeature"] = arg.AttachArg.Feature |
| | |
| | | if err != nil { |
| | | _ = logger.Error("json序列化错误", err) |
| | | } |
| | | esId := getCompareMsg(b) |
| | | logger.Info("比对出来的esid:",esId) |
| | | base := structure.BaseInfo{TargetId:esId} |
| | | arg.Liker = append(arg.Liker, &base) |
| | | dataId := getCompareMsg(b) |
| | | if esId == dataId { // 说明没比到相似的人 |
| | | logger.Info("没比到人") |
| | | arg.Uuid = dataId |
| | | } else { |
| | | logger.Info("比对出来的dataId:",dataId) |
| | | base := structure.BaseInfo{TargetId:dataId} |
| | | arg.Liker = append(arg.Liker, &base) |
| | | } |
| | | } |
| | | |
| | | func track (rule *protomsg.Rule,am *structure.AreaMap) structure.LittleRuleResult{ |
| | |
| | | if th,err := strconv.ParseFloat(rule.SdkArgValue,32); err == nil { |
| | | threshold = float32(th) |
| | | } |
| | | for i, arg := range am.FilterData { |
| | | for _, arg := range am.FilterData { |
| | | fillLiker(threshold,arg,am) |
| | | if len(arg.Liker) == 0 { |
| | | // 如果没有相似者则删除本目标数据 |
| | | am.FilterData = append(am.FilterData[:i],am.FilterData[i+1:]...) |
| | | } |
| | | //if len(arg.Liker) == 0 { |
| | | // // 如果没有相似者则删除本目标数据 |
| | | // am.FilterData = append(am.FilterData[:i],am.FilterData[i+1:]...) |
| | | //} |
| | | } |
| | | if len(am.FilterData) > 0 { |
| | | return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort} |
| | | } else { |
| | | return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort} |
| | | } |
| | | //if len(am.FilterData) > 0 { |
| | | // return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort} |
| | | //} else { |
| | | // return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort} |
| | | //} |
| | | // 无论有没有相似者都要返回true |
| | | return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort} |
| | | } |
| | | |
| | | func Push(){ |
| | |
| | | initFlag = true |
| | | for { |
| | | select { |
| | | // case <-ctx.Done(): |
| | | // return |
| | | case data := <- sender: |
| | | |
| | | logger.Info("数据长度为:",len(data)) |
| | | |
| | | logger.Debug("推送数据") |
| | | logger.Debug("推送数据:",len(data)) |
| | | if err = sock.Send(data); err != nil { |
| | | _ = logger.Error("推送socket发送数据失败: %s", err.Error()) |
| | | } |
| | |
| | | logger.Debug("数据推送成功!收到响应,数据长度为:",len(msg)) |
| | | receiver <- string(msg) |
| | | default: |
| | | |
| | | time.Sleep(time.Millisecond * 10) |
| | | } |
| | | } |
| | | } |