panlei
2019-07-04 23e956b0a7e0f79f34d2113b0fa1154bef3e6643
把yolo的目标位置数据也传下去用于标出那个目标框
2个文件已修改
75 ■■■■■ 已修改文件
ruleserver/ruleToformula.go 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
util/simpleCV.go 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/ruleToformula.go
@@ -138,6 +138,7 @@
    RuleGroupId string // 规则组id
    AlarmLevel  int32  // 报警等级
    RuleText    string // 文字版规则组
    Location    []Rect
}
type LittleRuleResult struct {
    SdkName string // 记录下此结果是哪个sdk的结果
@@ -288,18 +289,16 @@
    for _, va := range resultSplice {
        completeFormula = completeFormula + va.Result
    }
    if strings.HasPrefix(completeFormula,"&&") || strings.HasPrefix(completeFormula,"||") || strings.HasPrefix(completeFormula,">=") || strings.HasPrefix(completeFormula,"<=") || strings.HasPrefix(completeFormula,"==") || strings.HasPrefix(completeFormula,"!=") ||strings.HasPrefix(completeFormula,">") || strings.HasPrefix(completeFormula,"<") {
    if strings.HasPrefix(completeFormula, "&&") || strings.HasPrefix(completeFormula, "||") || strings.HasPrefix(completeFormula, ">=") || strings.HasPrefix(completeFormula, "<=") || strings.HasPrefix(completeFormula, "==") || strings.HasPrefix(completeFormula, "!=") || strings.HasPrefix(completeFormula, ">") || strings.HasPrefix(completeFormula, "<") {
        // 以这些开头的基本是联动任务
        if strings.HasPrefix(completeFormula,"&&") || strings.HasPrefix(completeFormula,"||") || strings.HasPrefix(completeFormula,">=") || strings.HasPrefix(completeFormula,"<=") || strings.HasPrefix(completeFormula,"==") || strings.HasPrefix(completeFormula,"!=") {
            completeFormula = completeFormula[2:len(completeFormula)-1]
        if strings.HasPrefix(completeFormula, "&&") || strings.HasPrefix(completeFormula, "||") || strings.HasPrefix(completeFormula, ">=") || strings.HasPrefix(completeFormula, "<=") || strings.HasPrefix(completeFormula, "==") || strings.HasPrefix(completeFormula, "!=") {
            completeFormula = completeFormula[2 : len(completeFormula)-1]
        }
        if strings.HasPrefix(completeFormula,">") || strings.HasPrefix(completeFormula,"<") {
            completeFormula = completeFormula[1:len(completeFormula)-1]
        if strings.HasPrefix(completeFormula, ">") || strings.HasPrefix(completeFormula, "<") {
            completeFormula = completeFormula[1 : len(completeFormula)-1]
        }
        log.Println("-------------------看看拔毛后的表达式:",completeFormula)
        expression, _ := govaluate.NewEvaluableExpression(completeFormula)
        if strings.HasPrefix(completeFormula, "&&") || strings.HasPrefix(completeFormula, "||") {
            panic("规则有误,得到的数学公式不可解析")
        }
        result, _ := expression.Evaluate(nil) // 得到数学公式的结果
        return result.(bool)
    }
@@ -362,7 +361,26 @@
                    }
                }
                if sdkName != "" {
                    args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkName, groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText})
                    // 把他们的位置数据也传下去
                    locations := []Rect{}
                    for _, sdkData := range args.Sdkdata {
                        for _, areaMap := range sdkData.AreaMapList {
                            for j := 0; j < len(groupRule.Rules); j++ {
                                locations = append(locations, putYolosToResult(groupRule.Rules[j], &areaMap)...)
                            }
                        }
                    }
                    //// 配了人脸的算法才把人脸的数据甩出来打标签
                    //flag11 := false
                    //for j := 0; j < len(groupRule.Rules); j++ {
                    //    if groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" || groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a971" {
                    //        flag11 = true
                    //    }
                    //}
                    //if flag11 {
                    //    args.RuleResult["face"] = faces
                    //}
                    args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkName, groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText,locations})
                    log.Println("-------------------yolo结果标签", args.RuleResult["yolo"].([]Result))
                }
                if args.RuleResult["face"] != nil {
@@ -389,6 +407,19 @@
    }
    //log.Println("-----------------------------------------------听说你是空的?",faces)
    return faces
}
func putYolosToResult(rule *protomsg.Rule, am *AreaMap) []Rect {
    locations := []Rect{}
    if rule.SdkId == am.sdkId && rule.SdkId != "812b674b-2375-4589-919a-5c1c3278a97e" && rule.SdkId != "812b674b-2375-4589-919a-5c1c3278a971" {
        if len(am.filterData) > 0 {
            for _, data := range am.filterData {
                locations = append(locations, data.Location)
            }
        }
    }
    //log.Println("-----------------------------------------------听说你是空的?",faces)
    return locations
}
// 计算区域内的目标数量以及将相似度、占比、尺寸等打包
@@ -501,13 +532,13 @@
        for _, va := range timeEle.RuleResults {
            if va.CameraId == args.CameraId {
                va.Result = strconv.FormatBool(isOk)
                log.Println("这个摄像机--",args.CameraId,"--被赋予了result",va.Result)
                log.Println("这个摄像机--", args.CameraId, "--被赋予了result", va.Result)
            }
        }
        // 判断结果数组是否完满(即被赋值完毕)可得出报警结果
        var isPerfect = true
        for _, va := range timeEle.RuleResults {
            log.Println("---------------------瞅瞅当前数组________________:",*va)
            log.Println("---------------------瞅瞅当前数组________________:", *va)
            if va.Result == "" && va.RuleWithPre != "||" {
                isPerfect = false
            }
@@ -535,7 +566,7 @@
                        }
                    }
                    if sdkName != "" {
                        args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkName, groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText})
                        args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkName, groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText,[]Rect{}})
                        log.Println("-------------------yolo结果标签", args.RuleResult["yolo"].([]Result))
                    }
                    if args.RuleResult["face"] != nil {
util/simpleCV.go
@@ -162,27 +162,12 @@
}
func DrawPolygonOnImage(cameraId string, img protomsg.Image) (maps map[string]interface{}, err0 error) {
    // draw the rook
    //ddd, err := RetrieveROM("/home/user/workspace/ruleprocess/util/105.jpg")
    //if err != nil {
    //    fmt.Println("解码有误",err)
    //}
    //bbb := bytes.NewBuffer(ddd)  // 必须加一个buffer 不然没有read方法就会报错
    //rook,_ := gocv.IMDecode(bbb.Bytes(),gocv.IMReadColor)
    rook, _ := gocv.NewMatFromBytes(int(img.Height), int(img.Width), gocv.MatTypeCV8UC3, img.Data)
    //rook := gocv.IMRead("/home/user/workspace/ruleprocess/util/105.jpg",gocv.IMReadColor)
    defer rook.Close()
    red := color.RGBA{255, 0, 0, 0}
    //points := [][]image.Point{
    //    {
    //        image.Pt(100., 100),
    //        image.Pt(100., 400),
    //        image.Pt(400, 400),
    //        image.Pt(400, 100),
    //    },
    //}
    //gocv.FillPoly(&rook, points, green)
    // 查到摄像机所有的区域并画框
    var cameraPolygons []protomsg.CameraPolygon
    cameraPolygons = cache.GetPolygonsByCameraId(cameraId)
@@ -197,7 +182,8 @@
        }
    }
    // 把目标框出来
    //gocv.Rectangle()
    //return nil,nil
    // 上传
    fdata, _ := gocv.IMEncode(".jpg", rook)