panlei
2019-11-13 1d9804998f955e7d713d24ae719c757c0be73993
个体静止开始测试
5个文件已修改
55 ■■■■■ 已修改文件
algorithm/middleware/middleware.go 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
algorithm/static/static.go 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/readyDataForRule.go 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/ruleToformula.go 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
structure/rule.go 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
algorithm/middleware/middleware.go
@@ -14,7 +14,7 @@
    "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 := ""
@@ -92,7 +92,7 @@
    }
    // 个体静止
    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)
@@ -214,9 +214,9 @@
            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
    }
}
@@ -288,8 +288,10 @@
        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 {
algorithm/static/static.go
@@ -113,12 +113,17 @@
        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 {
@@ -153,11 +158,13 @@
}
// 判断一个目标是否静止了指定时间
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
            }
@@ -166,13 +173,13 @@
    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
ruleserver/readyDataForRule.go
@@ -273,7 +273,7 @@
        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)
@@ -281,8 +281,6 @@
    }
    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)
}
ruleserver/ruleToformula.go
@@ -77,7 +77,7 @@
    }
}
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)
@@ -86,8 +86,8 @@
    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) {
@@ -104,8 +104,16 @@
    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 := ""
structure/rule.go
@@ -8,6 +8,7 @@
    Score      float64 // 区域内的目标的相似度
    Proportion float64 // 区域内的目标的占比
    Size       float64 // 区域内的目标的尺寸
    AreaJson   string  // 所属区域
    IsYolo     bool    // 是否是yolo数据
    Location   Rect    // 记下每个目标的位置参数,最后给结果装配人脸数据的时候用的到
    Feature    []byte
@@ -30,10 +31,9 @@
    TargetNum     int    // 区域内目标数量
    Args          []*Arg // 区域内目标集合
    FilterData    []*Arg // 过滤后区域内目标集合
    AlarmObj      []*Arg // 区域内最后满足规则的目标
    Time          string // 当前时间(用以匹配时间规则)
    IsEffective   bool   // 规则中是否用到了此区域
    KeepRight     bool   // 是否靠右行
    IsStatic      bool   // 是否静止
}
// sdk输出的图片上单个目标的数据