| | |
| | | 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 { |
| | |
| | | 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("没有首次报警的目标,不插入") |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | 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 { |
| | |
| | | Feature []byte |
| | | ThftRes protomsg.ThftResult |
| | | Liker []*BaseInfo |
| | | TimeLable string |
| | | CacheData ResultMsg |
| | | } |
| | | |
| | |
| | | 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) |