From 7cb7884e4bd7f27d811474d4e95f29eebac845cd Mon Sep 17 00:00:00 2001 From: panlei <2799247126@qq.com> Date: 星期二, 12 十一月 2019 17:56:54 +0800 Subject: [PATCH] 保存一下个体静止算法 --- algorithm/static/static.go | 250 ++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 193 insertions(+), 57 deletions(-) diff --git a/algorithm/static/static.go b/algorithm/static/static.go index 6caff13..b548cd9 100644 --- a/algorithm/static/static.go +++ b/algorithm/static/static.go @@ -7,78 +7,73 @@ "ruleprocess/ruleserver" "ruleprocess/structure" "strconv" + "sync" ) -//涓綋闈欐绠楁硶 -var StaticMap = make(map[string]CameraArea) - -type CameraArea struct { - targets []Obj - duration int - cache structure.ResultMsg -} -type Obj struct { - id string - location []structure.Rect - staticStatus int -} - -func Entrance(rule *protomsg.Rule, am *structure.AreaMap) structure.LittleRuleResult { - for _, obj := range am.FilterData { - var flag bool = true - for k, _ := range ruleserver.TimeEleList { - if k == rule.Id+""+strconv.Itoa(int(obj.Id)) { - flag = false // 鏈夊氨缃负false - logger.Info("鏈夎繖涓畾鏃跺櫒锛屼笉鍐嶅垱寤轰簡锛�") - } +func Entrance(rule *protomsg.Rule, am *structure.AreaMap,lable *structure.Others,args *structure.SdkDatas,message *protomsg.SdkMessage) structure.LittleRuleResult { + if rule.PolygonId == am.AreaId { // 棣栧厛杩欐潯瑙勫垯寰楁槸杩欎釜绠楁硶鐨勮鍒欙紝鍏舵瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓� + logger.Debug("---------璧颁簡浜哄憳寮傚父绠楁硶", rule.Id, rule.SdkArgAlias, rule.Operator, rule.SdkArgValue, am.AreaId) + if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" || rule.SdkArgAlias == "" { // 鍒ゆ柇鐨勬槸鐩镐技鍊硷紝鍗犳瘮锛屽昂瀵哥瓑杩囨护鏉′欢锛屽鏋滃啀鏈夛紝杩樺彲浠ュ啀鍔� + return filterRule(rule, am) + } else if rule.SdkArgAlias == "duration" { + return CompareAndSave(rule,am,lable,args,message) + } else { + return structure.LittleRuleResult{} } - if flag { - timeEle := ruleserver.TimeElement{N: 10, InitN: 10, AlarmFlag: false, BufferFlag: 5} // 鎵旇繘鍘讳竴涓畾鏃跺櫒鍏冪礌 - ruleserver.TimeEleList[rule.Id+""+strconv.Itoa(int(obj.Id))] = &timeEle // 瀹氭椂鍣ㄥ厓绱犱互灏忚鍒檌d鍜岀洰鏍噄d涓洪敭 - } + } else { + return structure.LittleRuleResult{} } - return structure.LittleRuleResult{} } // 杩囨护瑙勫垯鍏堢瓫閫夊嚭绗﹀悎鏉′欢鐨勭洰鏍囨暟閲� func filterRule(rule *protomsg.Rule, am *structure.AreaMap) structure.LittleRuleResult { // 澶勭悊鐨勯兘鏄痽olo鏁版嵁 - var args []*structure.Arg - if rule.RuleWithPre == "&&" { - args = am.FilterData - } else { - args = am.Args - } - // 鍏堟竻绌鸿繃婊ゅ悗鐨勬暟鎹紝鍐嶅線閲屽鏈杩囨护鍚庣殑鏁版嵁 - am.FilterData = am.FilterData[0:0] - //logger.Debug("鐪嬬湅args锛氾細锛氾細锛�", args) - for _, arg := range args { - var formula string - if rule.SdkArgAlias == "score" { - formula = strconv.FormatFloat(arg.Score, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮� - logger.Info("褰撳墠鐩镐技搴﹀皬鍏紡锛�", formula) - } else if rule.SdkArgAlias == "proportion" { - formula = strconv.FormatFloat(arg.Proportion, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮� - logger.Info("褰撳墠鍗犳瘮灏忓叕寮忥細", formula) + if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 鍒ゆ柇鐨勬槸鐩镐技鍊硷紝鍗犳瘮锛屽昂瀵哥瓑杩囨护鏉′欢锛屽鏋滃啀鏈夛紝杩樺彲浠ュ啀鍔� + var args []*structure.Arg + if rule.RuleWithPre == "&&" { + args = am.FilterData } else { - formula = strconv.FormatFloat(arg.Size, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮� - logger.Info("褰撳墠灏哄灏忓叕寮忥細", formula) + args = am.Args } - expression, _ := govaluate.NewEvaluableExpression(formula) // 寰楀埌鏁板鍏紡 - result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� - if result.(bool) { - am.FilterData = append(am.FilterData, arg) // 寰楀埌绗﹀悎鏉′欢鐨勮繃婊ゆ暟鎹� + // 鍏堟竻绌鸿繃婊ゅ悗鐨勬暟鎹紝鍐嶅線閲屽鏈杩囨护鍚庣殑鏁版嵁 + am.FilterData = am.FilterData[0:0] + //logger.Debug("鐪嬬湅args锛氾細锛氾細锛�", args) + for _, arg := range args { + var formula string + if rule.SdkArgAlias == "score" { + formula = strconv.FormatFloat(arg.Score, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮� + logger.Info("褰撳墠鐩镐技搴﹀皬鍏紡锛�", formula) + } else if rule.SdkArgAlias == "proportion" { + formula = strconv.FormatFloat(arg.Proportion, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮� + logger.Info("褰撳墠鍗犳瘮灏忓叕寮忥細", formula) + } else { + formula = strconv.FormatFloat(arg.Size, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮� + logger.Info("褰撳墠灏哄灏忓叕寮忥細", formula) + } + expression, _ := govaluate.NewEvaluableExpression(formula) // 寰楀埌鏁板鍏紡 + result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� + if result.(bool) { + am.FilterData = append(am.FilterData, arg) // 寰楀埌绗﹀悎鏉′欢鐨勮繃婊ゆ暟鎹� + } + } + am.TargetNum = len(am.FilterData) // 鎶婄鍚堟潯浠剁殑鐩爣鏁伴噺鏇存柊鍒皌argetNum瀛楁 + if am.TargetNum > 0 { + return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort} + } else { + return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort} + } + + } else if rule.SdkArgAlias == "" { + if am.TargetNum > 0 { + return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort} + } else { + return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort} } } - am.TargetNum = len(am.FilterData) // 鎶婄鍚堟潯浠剁殑鐩爣鏁伴噺鏇存柊鍒皌argetNum瀛楁 - if am.TargetNum > 0 { - return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort} - } else { - return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort} - } + return structure.LittleRuleResult{} } -// 鍒ゆ柇涓や釜鐭╁舰鐨勯噸鍚堝害锛屾妸闈㈢Н鏇村ぇ鐨勫仛鍒嗘瘝 +// 鍒ゆ柇涓や釜鐭╁舰鐨勯噸鍚堝害锛屾妸闈㈢Н鏇村ぇ鐨勫仛鍒嗘瘝锛屽嵆鍙栧皬鍊� func PgsInterPercent(pgpts []structure.Point, box structure.Rect, widthScale float64, heightScale float64) (percent float64) { areapts, areaBox := ruleserver.GetLocation(box, 10) @@ -98,3 +93,144 @@ } return (perInterPg * 100) } +// 鍒ゆ柇涓�涓尯鍩熷唴鏈夋病鏈夐潤姝㈢殑鐩爣 +func CompareAndSave(rule *protomsg.Rule, am *structure.AreaMap,lable *structure.Others,args *structure.SdkDatas,message *protomsg.SdkMessage) structure.LittleRuleResult { + initN := 60 + if rule.SdkId == "涓綋闈欐" && rule.SdkArgAlias == "duration" { + if init,err := strconv.Atoi(rule.SdkArgValue); err != nil { + logger.Debug("涓綋闈欐绠楁硶璇诲彇鎸佺画鏃堕棿澶辫触",err) + } else { + initN = init + } + } + if len(structure.StaticMap[am.AreaId].Targets) == 0 { // 鍗崇涓�甯ф暟鎹�(涔熶笉涓�瀹�)锛岃繕娌℃湁缂撳瓨 + objs := []*structure.Obj{} + for _, tar := range am.FilterData { + obj := &structure.Obj{Id: tar.Id, Location: tar.Location, N: initN,InitN:initN} + objs = append(objs, obj) + } + structure.StaticMap[am.AreaId] = &structure.CameraArea{objs} + return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort} + } else { + flag := "false" + for _, tar := range structure.StaticMap[am.AreaId].Targets { + singleResult := SingleStatic(tar,am,lable,90) + if singleResult { + flag = "true" + } + } + // 鏇存柊鏁版嵁,鎶婃柊鏉ョ殑鏁版嵁鍐欏叆缂撳瓨 + objs := []*structure.Obj{} + for _, tar := range am.FilterData { + flag1 := false + for _, OBJ := range structure.StaticMap[am.AreaId].Targets { + if tar.Id == OBJ.Id { + flag1 = true + } + } + if !flag1 { // 闆嗗悎涓病鏈夌殑鎵嶆彃鍏� + obj := &structure.Obj{Id: tar.Id, Location: tar.Location, N: initN,InitN:initN,AlarmFlag: false, BufferFlag: 10, CacheSdkData: structure.ResultMsg{message, nil}} + objs = append(objs, obj) + } + } + structure.StaticMap[am.AreaId] = &structure.CameraArea{objs} + return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + flag, rule.Sort} + } +} + +// rec鍙樹负[t]point 閫嗘椂閽堜竴鍦堢殑鍧愭爣 +func Rect2Point(rect structure.Rect) []structure.Point { + points := []structure.Point{} + point1 := structure.Point{rect.X, rect.Y} + points = append(points, point1) + point2 := structure.Point{rect.X, rect.Y + rect.Height} + points = append(points, point2) + point3 := structure.Point{rect.X + rect.Width, rect.Y + rect.Height} + points = append(points, point3) + point4 := structure.Point{rect.X + rect.Width, rect.Y} + points = append(points, point4) + return points +} + +// 鍒ゆ柇涓�涓洰鏍囨槸鍚﹂潤姝簡鎸囧畾鏃堕棿 +func SingleStatic(person *structure.Obj, am *structure.AreaMap,lable *structure.Others, argValue float64) bool{ + flag := false + for _, obj := range am.FilterData { + if person.Id == obj.Id { + coincidenceDegree := PgsInterPercent(Rect2Point(person.Location), obj.Location, 1, 1) + if coincidenceDegree >= argValue { + flag = true + } + } + } + if flag { // 鏈変竴涓璞′繚鎸侀潤姝紙id鐩哥瓑骞朵笖閲嶅悎搴﹂珮浜庨槇鍊硷級 + flagTime := TimerAlarm(lable,person,flag,am.AreaId) + if flagTime == "10" || flagTime == "11" { + return flag + } else { + return false + } + } else { + TimerAlarm(lable,person,flag,am.AreaId) + return flag + } +} +var rw sync.RWMutex +// 鍒ゆ柇鏄惁绗﹀悎瀹氭椂鍣ㄦ潯浠� +func TimerAlarm(oth *structure.Others,person *structure.Obj, result bool,areaId string) (string) { + var flagTime string // + + rw.Lock() + + if result { // 缁撴灉涓虹湡 + for k, tar := range structure.StaticMap[areaId].Targets { + if tar.Id == person.Id { + if tar.N == 0 && tar.AlarmFlag { + logger.Debug("-------------------------绗﹀悎鎸佺画鏃堕棿瑙勫垯浣嗗苟涓嶆槸棣栨锛屼笉鎶ヨ") + flagTime = "11" + oth.TimeLabel = flagTime + } + if tar.N == 0 && !tar.AlarmFlag { // 杩欑粍瑙勫垯鐨勫畾鏃跺櫒瑕佸叏閮ㄧ瓑浜�0 鏆備笖璁や负涓�缁勮鍒欏彧鏈変竴涓畾鏃跺櫒 + logger.Debug("鈥斺�斺�斺�斺�斺�斺�斺�斺�斺�斺��-------------棣栨绗﹀悎鎸佺画鏃堕棿瑙勫垯骞舵姤璀�") + flagTime = "10" + tar.AlarmFlag = true + oth.CacheData = []structure.ResultMsg{} + oth.CacheData = append(oth.CacheData,tar.CacheSdkData) + oth.TimeLabel = flagTime + } + if tar.N != 0 { + flagTime = "00" + // 鏈夊畾鏃跺櫒浣嗕笉涓�0鎶婂凡鎵撶殑鏍囩鍒犻櫎 + // args.RuleResult = nil + logger.Debug("------------------------缁撴灉涓虹湡浣嗚鏁板櫒涓嶅埌0锛屼笉鎶ヨ,姝ゆ椂鐨勮鏁板櫒", k, "鐨勫�间负锛�", tar.N) + } + } + } + } else { // 缁撴灉涓哄亣 骞叉帀杩欎釜璁℃暟鍣� + for index, tar := range structure.StaticMap[areaId].Targets { + if tar.Id == person.Id { + if tar.AlarmFlag { + if tar.BufferFlag == 0 { + logger.Debug("------------------------------鏉�姝昏鏁板櫒锛屾姤璀︽甯х姸鎬佹敼鍙樼殑鏁版嵁锛屾鏃剁殑璁℃暟鍣ㄧ殑鍊间负", tar.N) + flagTime = "12" + oth.TimeLabel = flagTime + structure.StaticMap[areaId].Targets = append(structure.StaticMap[areaId].Targets[:index],structure.StaticMap[areaId].Targets[index+1:]...) + } else { + if tar.BufferFlag > 0 { + logger.Debug("缂撳啿鍖哄噺鍑�") + tar.BufferFlag-- + } + } + } else { + logger.Debug("-----------缁撴灉涓哄亣涓斾笉鍒�0锛屾潃姝诲畾鏃跺櫒") + structure.StaticMap[areaId].Targets = append(structure.StaticMap[areaId].Targets[:index],structure.StaticMap[areaId].Targets[index+1:]...) + } + } + } + } + + rw.Unlock() + return flagTime +} + + -- Gitblit v1.8.0