panlei
2019-11-16 0d95e05cf47aa7b24a57a673db46d5607016016c
目标加timeLable
4个文件已修改
265 ■■■■■ 已修改文件
algorithm/static/static.go 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
insertdata/insertDataToEs.go 231 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
structure/rule.go 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
util/simpleCV.go 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
algorithm/static/static.go
@@ -223,12 +223,14 @@
                    if tar.N == 0 && tar.AlarmFlag {
                        logger.Debug("-------------------------符合持续时间规则但并不是首次,不报警")
                        flagTime = "11"
                        o.TimeLable = flagTime
                        o.CacheData = tar.CacheSdkData
                    }
                    if tar.N == 0 && !tar.AlarmFlag { // 这组规则的定时器要全部等于0   暂且认为一组规则只有一个定时器
                        logger.Debug("———————————-------------首次符合持续时间规则并报警")
                        flagTime = "10"
                        tar.AlarmFlag = true
                        o.TimeLable = flagTime
                        o.CacheData = tar.CacheSdkData
                    }
                    if tar.N != 0 {
insertdata/insertDataToEs.go
@@ -517,122 +517,135 @@
        logger.Info("插入定时目标信息:",len(msg.RuleResult["target"].([]structure.Result)))
        for _, yoloResult := range msg.RuleResult["target"].([]structure.Result) {
            // 装载目标信息`
            logger.Info("报警目标个数:",len(yoloResult.AlarmObj))
            //var target = new(Target)
            //target.TargetId = strconv.FormatUint(tar.Id, 10)
            //target.TargetScore = tar.Score
            //target.TargetLocation = Points{TopLeft: Point{tar.Location.X, tar.Location.Y}, BottomRight: Point{tar.Location.X + tar.Location.Width, tar.Location.Y + tar.Location.Height}}
            //logger.Info("人脸的id:",strconv.FormatUint(face.Id, 10))
            //var targetInfos []Target
            //targetInfos = append(targetInfos, *target)
            // 获取目标缓存图片
            url := []string{}
            //InsertYolo(msg.RuleResult["cacheData"].(ruleserver.ResultMsg))
            // 把缓存的数据上传后得到地址存进去
            // 解压缩并上传图片
            url1 := uploadImg(yoloResult.AlarmObj[0].CacheData)
            url = append(url,url1)
            // 添加报警规则组
            sdkNames := ""
            alarmRules := []AlarmRule{}
            sdkNames = sdkNames + yoloResult.SdkName
            alarm := ChangeToString(yoloResult.DefenceState, yoloResult.AlarmLevel)
            linkInfo := ""
            if yoloResult.IsLink {
                linkInfo = "联动任务"
            // 如果有首次报警的则本帧数据可以插入
            insertFlag := false
            alarmNum := 0
            for _,obj := range yoloResult.AlarmObj {
                if obj.TimeLable == "10" {
                    insertFlag = true
                    alarmNum++
                }
            }
            alarmRules = append(alarmRules, AlarmRule{yoloResult.RuleGroupId, alarm, yoloResult.RuleText, yoloResult.DefenceState, linkInfo})
            // 联动图像的处理
            linkTagInfos := []*LinkInfo{}
            for _, yoloResult := range msg.RuleResult["target"].([]structure.Result) {
                if (yoloResult.Others.TimeLabel == "01" || yoloResult.Others.TimeLabel == "10") && yoloResult.Others.LinkCache != nil && len(yoloResult.Others.LinkCache) > 1 {
                    for _, msg2 := range yoloResult.Others.LinkCache {
                        // 把msg2的数据装配成一个PerVideoPicture结构体
                        if msg2.Cid != msg.Cid {
                            linkTagInfos = append(linkTagInfos, msg2PersonVideo(msg2))
            if insertFlag {
                logger.Info("报警目标个数:",alarmNum)
                //var target = new(Target)
                //target.TargetId = strconv.FormatUint(tar.Id, 10)
                //target.TargetScore = tar.Score
                //target.TargetLocation = Points{TopLeft: Point{tar.Location.X, tar.Location.Y}, BottomRight: Point{tar.Location.X + tar.Location.Width, tar.Location.Y + tar.Location.Height}}
                //logger.Info("人脸的id:",strconv.FormatUint(face.Id, 10))
                //var targetInfos []Target
                //targetInfos = append(targetInfos, *target)
                // 获取目标缓存图片
                url := []string{}
                //InsertYolo(msg.RuleResult["cacheData"].(ruleserver.ResultMsg))
                // 把缓存的数据上传后得到地址存进去
                // 解压缩并上传图片
                url1 := uploadImg(yoloResult.AlarmObj[0].CacheData)
                url = append(url,url1)
                // 添加报警规则组
                sdkNames := ""
                alarmRules := []AlarmRule{}
                sdkNames = sdkNames + yoloResult.SdkName
                alarm := ChangeToString(yoloResult.DefenceState, yoloResult.AlarmLevel)
                linkInfo := ""
                if yoloResult.IsLink {
                    linkInfo = "联动任务"
                }
                alarmRules = append(alarmRules, AlarmRule{yoloResult.RuleGroupId, alarm, yoloResult.RuleText, yoloResult.DefenceState, linkInfo})
                // 联动图像的处理
                linkTagInfos := []*LinkInfo{}
                for _, yoloResult := range msg.RuleResult["target"].([]structure.Result) {
                    if (yoloResult.Others.TimeLabel == "01" || yoloResult.Others.TimeLabel == "10") && yoloResult.Others.LinkCache != nil && len(yoloResult.Others.LinkCache) > 1 {
                        for _, msg2 := range yoloResult.Others.LinkCache {
                            // 把msg2的数据装配成一个PerVideoPicture结构体
                            if msg2.Cid != msg.Cid {
                                linkTagInfos = append(linkTagInfos, msg2PersonVideo(msg2))
                            }
                        }
                    }
                }
            }
            linkTag := ""
            if len(linkTagInfos) > 0 {
                linkTag = "联动任务"
            }
            isAlarm := 0
            resp := make(map[string]interface{})
            // 解压缩并上传本帧数据图片
            bdata1, err := util.UnCompress(msg.Data)
            if err != nil {
                panic("解压缩图片时出现错误")
            }
            i := protomsg.Image{}
            err = proto.Unmarshal(bdata1, &i)
            if len(alarmRules) > 0 {
                isAlarm = 1
                //resp, err = util.PostFormBufferData(weedfsUrl, i, uuid.NewV4().String())
                resp, err = util.DrawPolygonOnImageForYolo(msg.Cid, i, msg.RuleResult["target"].([]structure.Result), weedfsUrl)
                linkTag := ""
                if len(linkTagInfos) > 0 {
                    linkTag = "联动任务"
                }
                isAlarm := 0
                resp := make(map[string]interface{})
                // 解压缩并上传本帧数据图片
                bdata1, err := util.UnCompress(msg.Data)
                if err != nil {
                    logger.Error("画框或上传图片服务器出错", err)
                    return
                    panic("解压缩图片时出现错误")
                }
                i := protomsg.Image{}
                err = proto.Unmarshal(bdata1, &i)
                if len(alarmRules) > 0 {
                    isAlarm = 1
                    //resp, err = util.PostFormBufferData(weedfsUrl, i, uuid.NewV4().String())
                    resp, err = util.DrawPolygonOnImageForYolo(msg.Cid, i, msg.RuleResult["target"].([]structure.Result), weedfsUrl)
                    if err != nil {
                        logger.Error("画框或上传图片服务器出错", err)
                        return
                    } else {
                        logger.Info("上传的图片信息:", resp)
                    }
                } else {
                    logger.Info("上传的图片信息:", resp)
                    isAlarm = 0
                    // 不是报警数据不存
                    return
                }
                if resp["fileUrl"] != nil {
                    url = append(url, resp["fileUrl"].(string))
                    //esDataId := uuid.NewV4().String()
                    peraction := Personaction{
                        msg.Push.PushId,
                        msg.Cid,
                        msg.Push.Cam.Name,
                        msg.Push.Cam.Addr,
                        msg.Tasklab.Taskid,
                        msg.Tasklab.Taskname,
                        sdkNames,
                        "",
                        alarmRules,
                        msg.Push.ServerId,
                        msg.Push.ServerName,
                        msg.Push.LocalIp,
                        "",
                        url,
                        i.Timestamp,
                        "",
                        isAlarm,
                        0,
                        0,
                        0,
                        nil,
                        linkTag,
                        linkTagInfos,
                    }
                    requstbody, err := json.Marshal(peraction)
                    if len(linkTagInfos)>0 {
                        logger.Info("联动任务1111")
                    }
                    if err != nil {
                        logger.Info("json parse error ", err)
                        return
                    }
                    resp1, err2 := EsReq("POST", personAction, requstbody)
                    if err2 != nil {
                        logger.Error("往ES插入数据失败", err)
                    } else {
                        logger.Debug("插入es返回的数据信息是(target):", resp1)
                        // 发出录像信号
                        ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: msg.Push.PushId, CameraId: msg.Cid, TaskId: msg.Tasklab.Taskid, VideoUrl: msg.Push.VideoUrl, ImgId: i.Id, SdkIds: []string{"-1"}, Type: 2})
                        for index,link := range linkTagInfos {
                            logger.Info("联动任务的录像信号:",index)
                            ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: msg.Push.PushId, CameraId: link.CameraId, TaskId: msg.Tasklab.Taskid, VideoUrl: msg.Push.VideoUrl, ImgId: i.Id, SdkIds: []string{strconv.Itoa(index)}, Type: 2})
                        }
                        logger.Warn("__________________________________________往ES插入target数据成功")
                        //os.Exit(1)
                    }
                }
            } else {
                isAlarm = 0
                // 不是报警数据不存
                return
            }
            if resp["fileUrl"] != nil {
                url = append(url, resp["fileUrl"].(string))
                //esDataId := uuid.NewV4().String()
                peraction := Personaction{
                    msg.Push.PushId,
                    msg.Cid,
                    msg.Push.Cam.Name,
                    msg.Push.Cam.Addr,
                    msg.Tasklab.Taskid,
                    msg.Tasklab.Taskname,
                    sdkNames,
                    "",
                    alarmRules,
                    msg.Push.ServerId,
                    msg.Push.ServerName,
                    msg.Push.LocalIp,
                    "",
                    url,
                    i.Timestamp,
                    "",
                    isAlarm,
                    0,
                    0,
                    0,
                    nil,
                    linkTag,
                    linkTagInfos,
                }
                requstbody, err := json.Marshal(peraction)
                if len(linkTagInfos)>0 {
                    logger.Info("联动任务1111")
                }
                if err != nil {
                    logger.Info("json parse error ", err)
                    return
                }
                resp1, err2 := EsReq("POST", personAction, requstbody)
                if err2 != nil {
                    logger.Error("往ES插入数据失败", err)
                } else {
                    logger.Debug("插入es返回的数据信息是(target):", resp1)
                    // 发出录像信号
                    ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: msg.Push.PushId, CameraId: msg.Cid, TaskId: msg.Tasklab.Taskid, VideoUrl: msg.Push.VideoUrl, ImgId: i.Id, SdkIds: []string{"-1"}, Type: 2})
                    for index,link := range linkTagInfos {
                        logger.Info("联动任务的录像信号:",index)
                        ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: msg.Push.PushId, CameraId: link.CameraId, TaskId: msg.Tasklab.Taskid, VideoUrl: msg.Push.VideoUrl, ImgId: i.Id, SdkIds: []string{strconv.Itoa(index)}, Type: 2})
                    }
                    logger.Warn("__________________________________________往ES插入target数据成功")
                    //os.Exit(1)
                }
                logger.Info("没有首次报警的目标,不插入")
            }
        }
    }
@@ -698,7 +711,7 @@
    }
    i := protomsg.Image{}
    err = proto.Unmarshal(bdata, &i)
    resp1, err1 := util.DrawPolygonOnImageForYolo(msg.Cid, i, msg.RuleResult["target"].([]structure.Result), weedfsUrl)
    resp1, err1 := util.DrawPolygonOnImageForTarget(msg.Cid, i, msg.RuleResult["target"].([]structure.Result), weedfsUrl)
    if err1 != nil {
        logger.Error("缓存数据画框或上传图片服务器出错", err)
    } else {
structure/rule.go
@@ -17,6 +17,7 @@
    Feature    []byte
    ThftRes    protomsg.ThftResult
    Liker      []*BaseInfo
    TimeLable  string
    CacheData  ResultMsg
}
util/simpleCV.go
@@ -187,6 +187,37 @@
    return
}
func DrawPolygonOnImageForTarget(cameraId string, img protomsg.Image, results []structure.Result,url string) (maps map[string]interface{}, err0 error) {
    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()
    yellow := color.RGBA{255, 255, 0, 0}
    red := color.RGBA{255, 0, 0, 0}
    scale := float64(img.Width) / 960 // 画图比例
    logger.Info("width:",img.Width,"--画图比例:",scale)
    // 分割区域id集合并根据id查询区域然后画框
    for _,result := range results  {
        polygonIds := strings.Split(result.AlarmPolygon,",")
        logger.Info("区域ID:",result.AlarmPolygon,polygonIds)
        for i := 0; i < len(polygonIds); i++ {
            polygon := getPolygonById(polygonIds[i],cameraId)
            if polygon.Polygon != "[]" && polygon.Polygon != ""{
                DrawAPolygon(&rook,polygon.Polygon,yellow,scale)
            }
        }
    }
    // 把目标框出来
    for _,result := range results  {
        for _,rect := range result.AlarmObj {
            gocv.Rectangle(&rook, image.Rect(int(rect.Location.X), int(rect.Location.Y), int(rect.Location.X+rect.Location.Width), int(rect.Location.Y+rect.Location.Height)), red, 1)
        }
    }
    //return nil,nil
    maps,err0 = UploadFromMat(url,rook)
    return
}
func DrawPolygonOnImageForFace(cameraId string, img protomsg.Image, results []structure.Result,url string) (maps map[string]interface{}, err0 error) {
    rook, _ := gocv.NewMatFromBytes(int(img.Height), int(img.Width), gocv.MatTypeCV8UC3, img.Data)