From 7cb7884e4bd7f27d811474d4e95f29eebac845cd Mon Sep 17 00:00:00 2001
From: panlei <2799247126@qq.com>
Date: 星期二, 12 十一月 2019 17:56:54 +0800
Subject: [PATCH] 保存一下个体静止算法

---
 algorithm/middleware/middleware.go     |   20 +-
 algorithm/intrusion/intrusion.go       |    2 
 util/simpleCV.go                       |    2 
 ruleserver/ruleToformula.go            |   35 ++--
 algorithm/static/static.go             |  250 ++++++++++++++++++++++++-------
 ruleserver/readyDataForRule.go         |   10 -
 algorithm/personUnsual/personUnsual.go |   78 ++++-----
 algorithm/faceCompare/faceCompare.go   |    2 
 algorithm/static/static_test.go        |   13 +
 insertdata/insertDataToEs.go           |   10 
 algorithm/face/face.go                 |    2 
 structure/algorithm.go                 |   17 ++
 labelFilter/readyDataForLabel.go       |   12 
 structure/rule.go                      |    5 
 ruleserver/timeTicker.go               |   11 +
 15 files changed, 319 insertions(+), 150 deletions(-)

diff --git a/algorithm/face/face.go b/algorithm/face/face.go
index 33e0d4b..2a46afc 100644
--- a/algorithm/face/face.go
+++ b/algorithm/face/face.go
@@ -8,7 +8,7 @@
 	"strconv"
 )
 // 浜鸿劯绠楁硶
-func Entrance(rule *protomsg.Rule, am *structure.AreaMap) structure.LittleRuleResult {
+func Entrance(rule *protomsg.Rule, am *structure.AreaMap,lable *structure.Others,args *structure.SdkDatas,message *protomsg.SdkMessage) structure.LittleRuleResult {
 	logger.Debug("---------璧颁簡浜鸿劯妫�娴嬬畻娉�",rule.Id,rule.SdkArgAlias,rule.Operator,rule.SdkArgValue,am.AreaId)
 	return filterRule(rule,am)
 }
diff --git a/algorithm/faceCompare/faceCompare.go b/algorithm/faceCompare/faceCompare.go
index a2f22f4..35f3596 100644
--- a/algorithm/faceCompare/faceCompare.go
+++ b/algorithm/faceCompare/faceCompare.go
@@ -8,7 +8,7 @@
 	"strconv"
 )
 // 浜鸿劯绠楁硶
-func Entrance(rule *protomsg.Rule, am *structure.AreaMap) structure.LittleRuleResult {
+func Entrance(rule *protomsg.Rule, am *structure.AreaMap,lable *structure.Others,args *structure.SdkDatas,message *protomsg.SdkMessage) structure.LittleRuleResult {
 	logger.Debug("---------璧颁簡浜鸿劯姣斿绠楁硶",rule.Id,rule.SdkArgAlias,rule.Operator,rule.SdkArgValue,am.AreaId)
 	return filterRule1(rule,am)
 }
diff --git a/algorithm/intrusion/intrusion.go b/algorithm/intrusion/intrusion.go
index 714e899..9a50098 100644
--- a/algorithm/intrusion/intrusion.go
+++ b/algorithm/intrusion/intrusion.go
@@ -9,7 +9,7 @@
 )
 
 //鍏ヤ镜绠楁硶
-func Entrance(rule *protomsg.Rule, am *structure.AreaMap) structure.LittleRuleResult {
+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瀵圭殑涓�
 		return filterRule(rule, am)
 	} else {
diff --git a/algorithm/middleware/middleware.go b/algorithm/middleware/middleware.go
index 7eb9b21..57b1c07 100644
--- a/algorithm/middleware/middleware.go
+++ b/algorithm/middleware/middleware.go
@@ -14,7 +14,7 @@
 	"time"
 )
 
-func Entrance (args *structure.SdkDatas,groupRule protomsg.GroupRule) (bool,string,string){
+func Entrance (args *structure.SdkDatas,groupRule protomsg.GroupRule,lable *structure.Others,message *protomsg.SdkMessage) (bool,string,string){
 	resultSplice := []*structure.LittleRuleResult{}
 	sdkNames := ""
 	polygonId := ""
@@ -33,7 +33,7 @@
 				if ipcId == sdkData.IpcId {
 					//logger.Info("褰撳墠璧扮殑瑙勫垯鏄�--锛�", sdkName, "---","")
 					for _, areaMap := range sdkData.AreaMapList {
-						ruleResult := CallSo(sdk.Id, groupRule.Rules[j], areaMap)
+						ruleResult := CallSo(sdk.Id, groupRule.Rules[j], areaMap,lable,args,message)
 						if ruleResult.Result != "" {
 							logger.Info("鏉′欢瑙勫垯缁撴灉锛�", ruleResult.Result)
 							// 濡傛灉缁撴灉涓虹湡锛屾妸杩欐潯瑙勫垯涓殑鍖哄煙缃负鏈夋晥
@@ -69,7 +69,7 @@
 				if ipcId == sdkData.IpcId {
 					//logger.Info("褰撳墠璧扮殑瑙勫垯鏄�--锛�", sdkName, "---","")
 					for _, areaMap := range sdkData.AreaMapList {
-						ruleResult := CallSo(sdk.Id, groupRule.Rules[j], areaMap)
+						ruleResult := CallSo(sdk.Id, groupRule.Rules[j], areaMap,lable,args,message)
 						if ruleResult.Result != "" {
 							logger.Info("浜鸿劯姣斿瑙勫垯缁撴灉锛�", ruleResult.Result)
 							// 濡傛灉缁撴灉涓虹湡锛屾妸杩欐潯瑙勫垯涓殑鍖哄煙缃负鏈夋晥
@@ -92,7 +92,7 @@
 	}
 	// 涓綋闈欐
 	for j := 0; j < len(groupRule.Rules); j++ {
-		if groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a972" && groupRule.Rules[j].SdkArgAlias != "time_rule"{
+		if groupRule.Rules[j].SdkId == "涓綋闈欐" && groupRule.Rules[j].SdkArgAlias != "time_rule"{
 			for _, sdkData := range args.Sdkdata {
 				// 鏍规嵁瑙勫垯鐨剆dkId鏌ュ嚭鍏跺搴旂殑ipcId锛岀敤ipcId鍘绘壘璇ユ瘮瀵圭殑鏁版嵁
 				sdk, err := cache.GetSdkById(groupRule.Rules[j].SdkId)
@@ -105,9 +105,9 @@
 				if ipcId == sdkData.IpcId {
 					//logger.Info("褰撳墠璧扮殑瑙勫垯鏄�--锛�", sdkName, "---","")
 					for _, areaMap := range sdkData.AreaMapList {
-						ruleResult := CallSo(sdk.Id, groupRule.Rules[j], areaMap)
+						ruleResult := CallSo(sdk.Id, groupRule.Rules[j], areaMap,lable,args,message)
 						if ruleResult.Result != "" {
-							logger.Info("浜鸿劯姣斿瑙勫垯缁撴灉锛�", ruleResult.Result)
+							logger.Info("涓綋闈欐缁撴灉锛�", ruleResult.Result)
 							// 濡傛灉缁撴灉涓虹湡锛屾妸杩欐潯瑙勫垯涓殑鍖哄煙缃负鏈夋晥
 							if strings.Contains(ruleResult.Result, "true") {
 								areaMap.IsEffective = true
@@ -139,7 +139,7 @@
 				sdkName := sdk.SdkName
 				if ipcId == sdkData.IpcId {
 					for _, areaMap := range sdkData.AreaMapList {
-						ruleResult := CallSo(sdk.Id, groupRule.Rules[j], areaMap)
+						ruleResult := CallSo(sdk.Id, groupRule.Rules[j], areaMap,lable,args,message)
 						if ruleResult.Result != "" {
 							if strings.Contains(ruleResult.Result, "true") {
 								areaMap.IsEffective = true
@@ -277,7 +277,7 @@
 	return structure.LittleRuleResult{}
 }
 
-func CallSo(sdkId string,rule *protomsg.Rule, am *structure.AreaMap) structure.LittleRuleResult{
+func CallSo(sdkId string,rule *protomsg.Rule, am *structure.AreaMap,lable *structure.Others,args *structure.SdkDatas,message *protomsg.SdkMessage) structure.LittleRuleResult{
 	// 鏍规嵁sdkId鏌ュ嚭鍏跺搴旂殑sdk鐨剆oName锛岃皟鐢ㄧ浉搴攕o鐨凟ntrance鏂规硶
 	var soName = ""
 	if sdkId == "812b674b-2375-4589-919a-5c1c3278a97e" {
@@ -288,6 +288,8 @@
 		soName = "personUnsual.so"
 	} else if sdkId == "812b674b-2375-4589-919a-5c1c3278a972" {
 		soName = "faceCompare.so"
+	} else if sdkId == "涓綋闈欐" {
+		soName = "static.so"
 	}
 	//soInfo,errr := cache.GetSoInfoById(sdkId)
 	//if errr != nil {
@@ -302,7 +304,7 @@
 	if err1 != nil {
 		panic("娌℃湁鎵惧埌鍏ュ彛鍑芥暟")
 	}
-	ruleResult := f.(func(rule *protomsg.Rule, am *structure.AreaMap)structure.LittleRuleResult)(rule,am)
+	ruleResult := f.(func(rule *protomsg.Rule, am *structure.AreaMap,lable *structure.Others, args *structure.SdkDatas,message *protomsg.SdkMessage)structure.LittleRuleResult)(rule,am,lable,args,message)
 	return ruleResult
 }
 
diff --git a/algorithm/personUnsual/personUnsual.go b/algorithm/personUnsual/personUnsual.go
index d110d6f..dc2f0bc 100644
--- a/algorithm/personUnsual/personUnsual.go
+++ b/algorithm/personUnsual/personUnsual.go
@@ -9,10 +9,10 @@
 )
 
 // 浜哄憳寮傚父绠楁硶
-func Entrance(rule *protomsg.Rule, am *structure.AreaMap) structure.LittleRuleResult {
+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" { // 鍒ゆ柇鐨勬槸鐩镐技鍊硷紝鍗犳瘮锛屽昂瀵哥瓑杩囨护鏉′欢锛屽鏋滃啀鏈夛紝杩樺彲浠ュ啀鍔�
+		if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" || rule.SdkArgAlias == "" { // 鍒ゆ柇鐨勬槸鐩镐技鍊硷紝鍗犳瘮锛屽昂瀵哥瓑杩囨护鏉′欢锛屽鏋滃啀鏈夛紝杩樺彲浠ュ啀鍔�
 			return filterRule(rule, am)
 		} else if rule.SdkArgAlias == "objCount" {
 			return transferParameters(rule, am)
@@ -27,48 +27,46 @@
 // 杩囨护瑙勫垯鍏堢瓫閫夊嚭绗﹀悎鏉′欢鐨勭洰鏍囨暟閲�
 func filterRule(rule *protomsg.Rule, am *structure.AreaMap) structure.LittleRuleResult {
 	// 澶勭悊鐨勯兘鏄痽olo鏁版嵁
-	if rule.PolygonId == am.AreaId { // 棣栧厛杩欐潯瑙勫垯寰楁槸杩欎釜绠楁硶鐨勮鍒欙紝鍏舵瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓�
-		if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 鍒ゆ柇鐨勬槸鐩镐技鍊硷紝鍗犳瘮锛屽昂瀵哥瓑杩囨护鏉′欢锛屽鏋滃啀鏈夛紝杩樺彲浠ュ啀鍔�
-			var args []*structure.Arg
-			if rule.RuleWithPre == "&&" {
-				args = am.FilterData
+	if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 鍒ゆ柇鐨勬槸鐩镐技鍊硷紝鍗犳瘮锛屽昂瀵哥瓑杩囨护鏉′欢锛屽鏋滃啀鏈夛紝杩樺彲浠ュ啀鍔�
+		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)
 			} else {
-				args = am.Args
+				formula = strconv.FormatFloat(arg.Size, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮�
+				logger.Info("褰撳墠灏哄灏忓叕寮忥細", formula)
 			}
-			// 鍏堟竻绌鸿繃婊ゅ悗鐨勬暟鎹紝鍐嶅線閲屽鏈杩囨护鍚庣殑鏁版嵁
-			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) // 寰楀埌绗﹀悎鏉′欢鐨勮繃婊ゆ暟鎹�
-				}
+			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}
-			}
+		}
+		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}
-			}
+	} 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}
 		}
 	}
 	return structure.LittleRuleResult{}
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
+}
+
+
diff --git a/algorithm/static/static_test.go b/algorithm/static/static_test.go
new file mode 100644
index 0000000..e2134bb
--- /dev/null
+++ b/algorithm/static/static_test.go
@@ -0,0 +1,13 @@
+package main
+
+import (
+	"fmt"
+	"ruleprocess/structure"
+	"testing"
+)
+
+func TestRect2Point(t *testing.T) {
+	rect := structure.Rect{100,100,200,200}
+	points := Rect2Point(rect)
+	fmt.Println(points)
+}
\ No newline at end of file
diff --git a/insertdata/insertDataToEs.go b/insertdata/insertDataToEs.go
index fc97d18..88f0aae 100644
--- a/insertdata/insertDataToEs.go
+++ b/insertdata/insertDataToEs.go
@@ -146,7 +146,7 @@
 
 // 寰�es涓彃鍏ヤ汉鑴告暟鎹�
 func InsertFace(msg structure.ResultMsg, linkId string) {
-	if msg.RuleResult["face"] != nil && len(msg.RuleResult["face"].([]structure.FaceResult)) > 0 {
+	if msg.RuleResult["face"] != nil && len(msg.RuleResult["face"].([]structure.TargetResult)) > 0 {
 		logger.Info("寰�ES鎻掍汉鑴告暟鎹�")
 		faces := []*FaceAndRules{}
 		faces = PutFace(faces, msg)
@@ -178,7 +178,7 @@
 				// 涓婁紶澶у浘
 				if imgMaxUrl == "" {
 					bigPhotoUrl := make(map[string]interface{})
-					bigPhotoUrl, err = util.DrawPolygonOnImageForFace(msg.Cid, i, msg.RuleResult["face"].([]structure.FaceResult), weedfsUrl)
+					bigPhotoUrl, err = util.DrawPolygonOnImageForFace(msg.Cid, i, msg.RuleResult["face"].([]structure.TargetResult), weedfsUrl)
 					logger.Debug("========澶у浘璺緞锛�", bigPhotoUrl)
 					imgMaxUrl = bigPhotoUrl["fileUrl"].(string)
 					picTime = i.Timestamp
@@ -259,8 +259,8 @@
 
 // 褰掔疆浜鸿劯
 func PutFace(faces []*FaceAndRules, msg structure.ResultMsg) []*FaceAndRules {
-	if msg.RuleResult["face"] != nil && len(msg.RuleResult["face"].([]structure.FaceResult)) > 0 {
-		for _, faceResult := range msg.RuleResult["face"].([]structure.FaceResult) {
+	if msg.RuleResult["face"] != nil && len(msg.RuleResult["face"].([]structure.TargetResult)) > 0 {
+		for _, faceResult := range msg.RuleResult["face"].([]structure.TargetResult) {
 			faces = hebingFace(faces, faceResult)
 		}
 		return faces
@@ -268,7 +268,7 @@
 		return nil
 	}
 }
-func hebingFace(faces []*FaceAndRules, faceResult structure.FaceResult) []*FaceAndRules {
+func hebingFace(faces []*FaceAndRules, faceResult structure.TargetResult) []*FaceAndRules {
 	for _, arg := range faceResult.Args {
 		// 鎷垮埌姣忎竴寮犱汉鑴�
 		//logger.Info("褰掔疆浜鸿劯鏃剁浉浼艰�呯殑鏁伴噺锛�", len(arg.Liker))
diff --git a/labelFilter/readyDataForLabel.go b/labelFilter/readyDataForLabel.go
index 5c792e1..8aa4406 100644
--- a/labelFilter/readyDataForLabel.go
+++ b/labelFilter/readyDataForLabel.go
@@ -13,14 +13,14 @@
 	CameraAddr    string
 	TaskId        string
 	Time		  string
-	Persons       []structure.FaceResult
+	Persons       []structure.TargetResult
 	DefenceLevel  []int32
 }
 // 鎶婃暟鎹閰嶅埌label
 func (label *Label)DataFormatToLabel(result structure.ResultMsg) {
-	logger.Debug("face缁撴灉锛�",result.RuleResult["face"] != nil && len(result.RuleResult["face"].([]structure.FaceResult)) > 0)
+	logger.Debug("face缁撴灉锛�",result.RuleResult["face"] != nil && len(result.RuleResult["face"].([]structure.TargetResult)) > 0)
 	logger.Debug("yolo缁撴灉锛�",result.RuleResult["yolo"] != nil && len(result.RuleResult["yolo"].([]structure.Result)) > 0)
-	if (result.RuleResult["face"] != nil && len(result.RuleResult["face"].([]structure.FaceResult)) > 0) || (result.RuleResult["yolo"] != nil && len(result.RuleResult["yolo"].([]structure.Result)) > 0) { // 寰楁湁浜鸿劯鎴栬�厃olo瑙勫垯鎵嶅彲浠�
+	if (result.RuleResult["face"] != nil && len(result.RuleResult["face"].([]structure.TargetResult)) > 0) || (result.RuleResult["yolo"] != nil && len(result.RuleResult["yolo"].([]structure.Result)) > 0) { // 寰楁湁浜鸿劯鎴栬�厃olo瑙勫垯鎵嶅彲浠�
 
 		// 鍏堝垽鏂竴涓嬫暟鎹甫鐨勮鍒欐爣绛炬槸鍚︽湁鎶ヨ鐨勫彲浠ユ帹閫佺殑
 		flag := false
@@ -30,7 +30,7 @@
 				flag = true
 			}
 		}
-		if flag || (result.RuleResult["face"] != nil && len(result.RuleResult["face"].([]structure.FaceResult)) > 0){
+		if flag || (result.RuleResult["face"] != nil && len(result.RuleResult["face"].([]structure.TargetResult)) > 0){
 			logger.Info("---------------鏍囩杩囨护鍣ㄨ祴鍊�")
 			label.CameraId = result.Cid
 			camera, err := cache.GetCameraById(result.Cid)
@@ -41,8 +41,8 @@
 			label.CameraAddr = camera.Addr
 			label.TaskId = result.Tasklab.Taskid
 			label.Time = time.Now().Format("2006-01-02 15:04:05")
-			if result.RuleResult["face"] != nil && len(result.RuleResult["face"].([]structure.FaceResult)) > 0 {
-				for _,faceGroup := range result.RuleResult["face"].([]structure.FaceResult) {
+			if result.RuleResult["face"] != nil && len(result.RuleResult["face"].([]structure.TargetResult)) > 0 {
+				for _,faceGroup := range result.RuleResult["face"].([]structure.TargetResult) {
 					label.Persons = append(label.Persons,faceGroup)
 					label.DefenceLevel = append(label.DefenceLevel,faceGroup.AlarmLevel)
 				}
diff --git a/ruleserver/readyDataForRule.go b/ruleserver/readyDataForRule.go
index 91b36da..5f603fb 100644
--- a/ruleserver/readyDataForRule.go
+++ b/ruleserver/readyDataForRule.go
@@ -236,14 +236,6 @@
 							//logger.Info("--------------鐪嬬湅compareFlag鐨勫�煎拰tableId鍜宎reaMap.args鐨勯暱搴︼細",compareFlag,tableIds,len(areaMap.args))
 							for _, arg := range areaMap.Args {
 								arg.Liker = arg.Liker[0:0]
-								//logger.Info("娓呯┖涔嬪悗鐪嬬湅涔嬪墠鎵撶殑浜鸿劯鏍囩鍙樹簡娌★細")
-								//if args.RuleResult["face"] != nil && len(args.RuleResult["face"].([]FaceResult)) > 0 {
-								//	for _, faceResult := range args.RuleResult["face"].([]FaceResult) {
-								//		for _,arg := range faceResult.Args {
-								//			logger.Info("浜哄憳鍒嗗�兼槸锛�",arg.Score,"liker鐨勬暟閲忎负",arg.Liker)
-								//		}
-								//	}
-								//}
 								if compareFlag == 1 {
 									fillLiker(nil, threshold, arg)
 								}
@@ -281,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{}}
+			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}
 			//logger.Println("鏀捐繘鍘荤殑arg锛�-------", arg1)
 			a.Args = append(a.Args, &arg1)
 			a.FilterData = append(a.FilterData, &arg1)
diff --git a/ruleserver/ruleToformula.go b/ruleserver/ruleToformula.go
index d5433ae..7838d53 100644
--- a/ruleserver/ruleToformula.go
+++ b/ruleserver/ruleToformula.go
@@ -36,7 +36,8 @@
 		// 寰楀埌灞炰簬璇ユ憚鍍忔満鐨勮嫢骞茬粍浠诲姟鐨勫畬鏁磋鍒欙紙璺熸瘡涓�鏉″畬鏁磋鍒欐瘮杈冧箣鍚庡緱鍑烘湰寮犲浘鍍忓浜庢煇涓鍒欐槸鍚︽姤璀︾殑缁撴灉銆傛斁杩沵ap锛屾瘮濡傛湰甯у浘鍍忕殑id锛屾墍纰版挒鎴愬姛鐨勮鍒檌d锛�
 		args.RuleResult = make(map[string]interface{})
 		args.RuleResult["yolo"] = []structure.Result{}
-		args.RuleResult["face"] = []structure.FaceResult{}
+		args.RuleResult["face"] = []structure.TargetResult{}
+		args.RuleResult["target"] = []structure.TargetResult{}
 		//logger.Warn("浼犺繘鍘讳箣鍓嶆槸浠�涔堝痉琛岋細",args.RuleResult["yolo"])
 		if taskGroup != nil && len(taskGroup.GroupRules) > 0 {
 			// 鍏堣繃鐙珛锛屽啀杩囪仈鍔�
@@ -76,7 +77,7 @@
 	}
 }
 
-func CallMiddleware(args *structure.SdkDatas,rule protomsg.GroupRule) (bool, 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)
@@ -85,7 +86,7 @@
 	if err1 != nil {
 		panic("娌℃湁鎵惧埌涓棿浠跺叆鍙e嚱鏁�")
 	}
-	a,b,c := f.(func(args *structure.SdkDatas,rule protomsg.GroupRule)(bool, string, string))(args,rule)
+	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
 }
 
@@ -102,7 +103,7 @@
 	sdkNames := ""
 	polygonId := ""
 	// 鎶婁竴甯ф暟鎹拰涓�缁勮鍒欏彂缁欑畻娉曢儴鍒嗭紝寰楀嚭鍒ゆ柇缁撴灉
-	result,sdkNames,polygonId = CallMiddleware(args,*groupRule)
+	result,sdkNames,polygonId = CallMiddleware(args,*groupRule,&label,message)
 
 	if result {
 		// 鏈�鍚庤繃鎸佺画鏃堕棿绛夋椂闂寸淮搴︾殑鏉′欢   鎶婃椂闂磋鍒欎綅缃皟鏁村埌杩欎釜浣嶇疆鏄负浜嗙紦瀛樻暟鎹�
@@ -177,7 +178,7 @@
 				//logger.Info("-------------------yolo缁撴灉鏍囩闀垮害", len(args.RuleResult["yolo"].([]Result)))
 			}
 			if faceFlag {
-				args.RuleResult["face"] = append(args.RuleResult["face"].([]structure.FaceResult), structure.FaceResult{structure.Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, []structure.TargetInfo{}, polygonId, islink,label,}, faces})
+				args.RuleResult["face"] = append(args.RuleResult["face"].([]structure.TargetResult), structure.TargetResult{structure.Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, []structure.TargetInfo{}, polygonId, islink,label,}, faces})
 				//logger.Info("-------------------face缁撴灉鏍囩", len(args.RuleResult["face"].([]FaceResult)))
 				labelTypes = append(labelTypes,1)
 			}
@@ -192,9 +193,9 @@
 						}
 					}
 					if k == "face" {
-						tempMap[k] = []structure.FaceResult{}
-						for _, res := range result.([]structure.FaceResult) {
-							tempMap[k] = append(tempMap[k].([]structure.FaceResult), res)
+						tempMap[k] = []structure.TargetResult{}
+						for _, res := range result.([]structure.TargetResult) {
+							tempMap[k] = append(tempMap[k].([]structure.TargetResult), res)
 						}
 					}
 				}
@@ -305,9 +306,9 @@
 						}
 					}
 					if k == "face" {
-						tempMap[k] = []structure.FaceResult{}
-						for _, res := range result.([]structure.FaceResult) {
-							tempMap[k] = append(tempMap[k].([]structure.FaceResult), res)
+						tempMap[k] = []structure.TargetResult{}
+						for _, res := range result.([]structure.TargetResult) {
+							tempMap[k] = append(tempMap[k].([]structure.TargetResult), res)
 						}
 					}
 				}
@@ -351,9 +352,9 @@
 								args.RuleResult["yolo"].([]structure.Result)[i].Others.LinkCache = label.LinkCache
 							}
 						}
-						for i := 0; i < len(args.RuleResult["face"].([]structure.FaceResult)); i++ {
-							if args.RuleResult["face"].([]structure.FaceResult)[i].RuleGroupId == groupRule.GroupId { // 鎶婅仈鍔ㄦ暟鎹拷鍔犱笂
-								args.RuleResult["face"].([]structure.FaceResult)[i].Others.LinkCache = label.LinkCache
+						for i := 0; i < len(args.RuleResult["face"].([]structure.TargetResult)); i++ {
+							if args.RuleResult["face"].([]structure.TargetResult)[i].RuleGroupId == groupRule.GroupId { // 鎶婅仈鍔ㄦ暟鎹拷鍔犱笂
+								args.RuleResult["face"].([]structure.TargetResult)[i].Others.LinkCache = label.LinkCache
 							}
 						}
 					}
@@ -371,9 +372,9 @@
 					}
 				}
 				if val == 1 {
-					if len(args.RuleResult["face"].([]structure.FaceResult)) >= 1 {
-						lens := len(args.RuleResult["face"].([]structure.FaceResult))-1
-						args.RuleResult["face"] = args.RuleResult["face"].([]structure.FaceResult)[0:lens]
+					if len(args.RuleResult["face"].([]structure.TargetResult)) >= 1 {
+						lens := len(args.RuleResult["face"].([]structure.TargetResult))-1
+						args.RuleResult["face"] = args.RuleResult["face"].([]structure.TargetResult)[0:lens]
 					}
 				}
 			}
diff --git a/ruleserver/timeTicker.go b/ruleserver/timeTicker.go
index 820ab18..c0c0037 100644
--- a/ruleserver/timeTicker.go
+++ b/ruleserver/timeTicker.go
@@ -42,11 +42,12 @@
 			logger.Info("瀹氭椂鍣ㄦ墽琛屽崟鍏�", time.Now().Unix())
 			fmt.Println("瀹氭椂鍣ㄦ墽琛屽崟鍏�", time.Now().Unix())
 			// 姣忕閽熻鏁板櫒姹犲瓙閲屾墍鏈夌殑璁℃暟鍣ㄥ厓绱犻兘鍑忎竴锛屽噺鍒�0鐨勬槸璇ユ姤璀︾殑
+			// 鍥剧墖瀹氭椂鍣ㄧ郴鍒�
 			rw.Lock()
 			for k, timeEle := range TimeEleList {
 				if timeEle.N > 0 {
 					timeEle.N = timeEle.N - 1
-					logger.Error("-------------------------------------鎵撳嵃瀹氭椂鍣ㄨ鏁板厓绱犲綋鍓嶅��-----------------------------------------锛�", timeEle.N)
+					logger.Debug("-------------------------------------鎵撳嵃瀹氭椂鍣ㄨ鏁板厓绱犲綋鍓嶅��-----------------------------------------锛�", timeEle.N)
 				}
 				if timeEle.GroupId != "" && timeEle.N == 0 {
 					// 璇存槑鏄仈鍔ㄤ换鍔$殑鏃堕棿绐楀彛 鍒扮偣鍎夸簡璇ラ攢姣佷簡,鍐嶆潵浜嗗啀鍒涘缓
@@ -54,6 +55,14 @@
 				}
 			}
 			rw.Unlock()
+			// 鐩爣瀹氭椂鍣ㄧ郴鍒�
+			for _,cameraArea := range structure.StaticMap {
+				for _,obj := range cameraArea.Targets {
+					if obj.N > 0 {
+						obj.N = obj.N - 1
+					}
+				}
+			}
 		case stop := <-stopChan:
 			if stop {
 				logger.Info("瀹氭椂鍣ㄧ粨鏉�")
diff --git a/structure/algorithm.go b/structure/algorithm.go
new file mode 100644
index 0000000..e40b2c2
--- /dev/null
+++ b/structure/algorithm.go
@@ -0,0 +1,17 @@
+package structure
+
+//涓綋闈欐绠楁硶
+var StaticMap = make(map[string]*CameraArea)
+
+type CameraArea struct {
+	Targets []*Obj
+}
+type Obj struct {
+	Id           uint64
+	Location     Rect
+	N            int // 璁℃暟鍣ㄥ綋鍓嶅��
+	InitN		 int // 璁℃暟鍣ㄥ垵濮嬪��
+	BufferFlag	 int // 缂撳啿瀹归敊浣� 杩炵画n甯alse鎵嶄负false
+	AlarmFlag	 bool
+	CacheSdkData ResultMsg // 瀹氭椂鍣ㄧ殑缂撳瓨鏁版嵁 鎸佺画鏃堕棿绫荤殑寮�鍚畾鏃跺櫒鏃惰缂撳瓨涓�甯�
+}
\ No newline at end of file
diff --git a/structure/rule.go b/structure/rule.go
index 60fe306..ce55b80 100644
--- a/structure/rule.go
+++ b/structure/rule.go
@@ -13,6 +13,7 @@
 	Feature    []byte
 	ThftRes    protomsg.ThftResult
 	Liker      []*BaseInfo
+	CacheData  ResultMsg
 }
 
 // 姣忎釜鍖哄煙鍐呯殑鍥剧墖鏁版嵁闆嗗悎
@@ -68,7 +69,7 @@
 
 type ResultMsg struct {
 	*protomsg.SdkMessage
-	RuleResult map[string]interface{} // 杩囧畬瑙勫垯鍚庢墦鐨勬爣绛� face: []FaceResult, yolo: []Result
+	RuleResult map[string]interface{} // 杩囧畬瑙勫垯鍚庢墦鐨勬爣绛� face: []FaceResult, yolo: []Result  target
 }
 
 // 杩囪鍒欏簱鎵撲笂鐨勬爣绛�
@@ -97,7 +98,7 @@
 }
 
 // 杩囪鍒欏簱鎵撲笂鐨勬爣绛�
-type FaceResult struct {
+type TargetResult struct {
 	Result
 	Args []Arg
 }
diff --git a/util/simpleCV.go b/util/simpleCV.go
index bb34716..23bee35 100644
--- a/util/simpleCV.go
+++ b/util/simpleCV.go
@@ -187,7 +187,7 @@
 	return
 }
 
-func DrawPolygonOnImageForFace(cameraId string, img protomsg.Image, results []structure.FaceResult,url string) (maps map[string]interface{}, err0 error) {
+func DrawPolygonOnImageForFace(cameraId string, img protomsg.Image, results []structure.TargetResult,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)

--
Gitblit v1.8.0