From 6622f4a2288429d2868ec47d9cd968bace55b37d Mon Sep 17 00:00:00 2001
From: panlei <2799247126@qq.com>
Date: 星期四, 11 七月 2019 16:47:35 +0800
Subject: [PATCH] 修正报警区域,拆分代码

---
 util/upload.go               |   59 +++++++++++
 util/simpleCV.go             |  112 +++++++---------------
 insertdata/insertDataToEs.go |    6 -
 ruleserver/ruleToformula.go  |   67 ++++++------
 4 files changed, 130 insertions(+), 114 deletions(-)

diff --git a/insertdata/insertDataToEs.go b/insertdata/insertDataToEs.go
index f67c8ed..2f6d7ca 100644
--- a/insertdata/insertDataToEs.go
+++ b/insertdata/insertDataToEs.go
@@ -101,7 +101,6 @@
 func InsertToEs(msg ruleserver.ResultMsg) {
 
 	// 鐩存帴浠庤鍒欑殑鏍囩鏁版嵁閲屾嬁绗﹀悎瑙勫垯鐨勪汉鑴哥粨鏋�
-	//logger.Info("------------------------------------浠庨厤缃枃浠惰鍙栫殑鍊硷細",weedfsUrl)
 	if msg.RuleResult["face"] != nil && len(msg.RuleResult["face"].([]ruleserver.Arg)) > 0 {
 		logger.Info("寰�ES鎻掍汉鑴告暟鎹�")
 		for _, face := range msg.RuleResult["face"].([]ruleserver.Arg) {
@@ -135,7 +134,6 @@
 				}
 				i := protomsg.Image{}
 				err = proto.Unmarshal(bdata, &i)
-				logger.Info("-------------------------------------------鐪嬩笅瀹藉拰楂�", int(face.Location.X),int(face.Location.Y),int(face.Location.X+face.Location.Width),int(face.Location.Y+face.Location.Height))
 				bytes := util.SubImg(i, int(face.Location.X), int(face.Location.Y), int(face.Location.X+face.Location.Width), int(face.Location.Y+face.Location.Height))
 				resp, err := util.PostFormBufferData1(weedfsUrl, bytes, uuid.NewV4().String())
 				if err != nil {
@@ -268,9 +266,7 @@
 
 				}
 				err = EsReq("POST", "http://192.168.1.182:9200/videopersons/perVideoPicture", requstbody)
-				logger.Info("璺熷簳搴撶殑鐩镐技鏁版嵁---------锛�", face.Liker)
-
-				fmt.Println("------------------------------------------鍝堝搱鍝堝搱锛屽簳搴撴湁浜�")
+				logger.Info("------------------------------------------鍝堝搱鍝堝搱锛屽簳搴撴湁浜�")
 
 			}
 		}
diff --git a/ruleserver/ruleToformula.go b/ruleserver/ruleToformula.go
index 02deb86..7b888b9 100644
--- a/ruleserver/ruleToformula.go
+++ b/ruleserver/ruleToformula.go
@@ -89,8 +89,8 @@
 	triggerLine   string
 	directionLine string
 	targetNum     int    // 鍖哄煙鍐呯洰鏍囨暟閲�
-	args          []*Arg  // 鍖哄煙鍐呯洰鏍囬泦鍚�
-	filterData    []*Arg  // 杩囨护鍚庡尯鍩熷唴鐩爣闆嗗悎
+	args          []*Arg // 鍖哄煙鍐呯洰鏍囬泦鍚�
+	filterData    []*Arg // 杩囨护鍚庡尯鍩熷唴鐩爣闆嗗悎
 	time          string // 褰撳墠鏃堕棿锛堢敤浠ュ尮閰嶆椂闂磋鍒欙級
 	keepRight     bool   // 鏄惁闈犲彸琛�
 	isStatic      bool   // 鏄惁闈欐
@@ -115,7 +115,7 @@
 	IsStatic    bool       // 鏄惁闈欐
 	ImageWidth  int        // 鎽勫儚鏈烘媿鎽勭殑鍥惧儚瀹� 鍍忕礌
 	ImageHeight int        // 鎽勫儚鏈烘媿鎽勭殑鍥惧儚楂� 鍍忕礌
-	AreaMapList []*AreaMap  // 鏈瑂dk鎻愬彇鐨勬暟鎹寜鐓у尯鍩熷垝鍒嗗悗鐨勬暟鎹泦鍚�
+	AreaMapList []*AreaMap // 鏈瑂dk鎻愬彇鐨勬暟鎹寜鐓у尯鍩熷垝鍒嗗悗鐨勬暟鎹泦鍚�
 }
 
 // 浠庣畻娉曟ā鍧楀効鎷挎潵鐨勫涓�甯у浘鍍忓悇涓畻娉曟彁鍙栫殑鏁版嵁闆嗗悎
@@ -135,12 +135,13 @@
 
 // 杩囪鍒欏簱鎵撲笂鐨勬爣绛�
 type Result struct {
-	TaskId      string // 浠诲姟id
-	SdkName     string
-	RuleGroupId string // 瑙勫垯缁刬d
-	AlarmLevel  int32  // 鎶ヨ绛夌骇
-	RuleText    string // 鏂囧瓧鐗堣鍒欑粍
-	Location    []Rect
+	TaskId       string // 浠诲姟id
+	SdkName      string
+	RuleGroupId  string // 瑙勫垯缁刬d
+	AlarmLevel   int32  // 鎶ヨ绛夌骇
+	RuleText     string // 鏂囧瓧鐗堣鍒欑粍
+	Location     []Rect // 鐩爣鐨勫潗鏍�
+	AlarmPolygon string // 瑙﹀彂鐨勬姤璀︽
 }
 type LittleRuleResult struct {
 	SdkName string // 璁板綍涓嬫缁撴灉鏄摢涓猻dk鐨勭粨鏋�
@@ -222,7 +223,9 @@
 		}
 	}
 }
-func (arg *Arg) fillLiker(){
+
+// 缁欑洰鏍囧~鍏卨iker
+func (arg *Arg) fillLiker() {
 	bytes := bigCache.Getdbpersonmsg("", arg.Feature, true)
 	var m map[string]float32
 	err1 := json.Unmarshal(bytes, &m)
@@ -277,26 +280,13 @@
 								if compareFlag == 2 {
 									array := strings.Split(tableIds, ",")
 									for i := 0; i < len(array)-1; i++ {
-										bytes := bigCache.Getdbpersonmsg(array[i], arg.Feature, true)
-										var m map[string]float32
-										err1 := json.Unmarshal(bytes, &m)
-										if err1 != nil {
-											logger.Error("getBaseInfo瑙e帇閿欒", err1)
-										}
-										for key, val := range m {
-											baseinfo, err1 := esutil.Dbpersoninfosbyid(key)
-											if err1 != nil {
-												logger.Error("鏌ヨ搴曞簱浜哄憳淇℃伅鍑洪敊", err1)
-											}
-											baseinfo.CompareScore = val
-											arg.Liker = append(arg.Liker, &baseinfo)
-										}
+										arg.fillLiker()
 									}
 								}
 								logger.Info("-------------------鎴愬姛缁檒iker璧嬪��,闀垮害涓猴細", len(arg.Liker))
 							}
 							areaMap.filterData = areaMap.args
-							logger.Info("=======绗竴娆$湅args锛�",areaMap.filterData)
+							//logger.Info("=======绗竴娆$湅args锛�",(areaMap.filterData))
 						}
 					}
 				}
@@ -314,6 +304,7 @@
 	Compare(args, groupRule)
 	resultSplice := []*LittleRuleResult{}
 	sdkNames := ""
+	polygonId := ""
 	// 鍏堣繃瀹屾潯浠惰鍒�
 	for j := 0; j < len(groupRule.Rules); j++ {
 		for _, sdkData := range args.Sdkdata {
@@ -324,16 +315,20 @@
 			}
 			ipcId := sdk.IpcId
 			sdkName := sdk.SdkName
-			logger.Info("瑙勫垯鐨刬pcId涓巗dkData鐨処pcId:",ipcId,"===",sdkData.IpcId)
+			logger.Info("瑙勫垯鐨刬pcId涓巗dkData鐨処pcId:", ipcId, "===", sdkData.IpcId)
 			if ipcId == sdkData.IpcId {
 				logger.Info("褰撳墠璧扮殑瑙勫垯鐨勭畻娉曟槸--锛�", sdkName, "---")
 				for _, areaMap := range sdkData.AreaMapList {
 					ruleResult := filterRule(groupRule.Rules[j], areaMap)
 					if ruleResult.Result != "" {
 						logger.Info("鏉′欢瑙勫垯缁撴灉锛�", ruleResult.Result)
-						// 濡傛灉姝ょ粨鏋滀负鐪熶笖褰撳墠杩囩殑鏄痽olo绠楁硶锛屽簲璁颁笅姝よ鍒欐墍瀵瑰簲鐨剆dkName,鍙﹀锛岃繕瑕佸幓閲�
-						if ruleResult.Result == "true" && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(sdkNames, sdkName) {
+						// 濡傛灉姝ょ粨鏋滀负鐪熶笖褰撳墠杩囩殑鏄痽olo绠楁硶锛屽簲璁颁笅姝よ鍒欐墍瀵瑰簲鐨剆dkName,鍙﹀锛岃繕瑕佸幓閲� (鍚庡姞锛氭妸姝ゆ潯瑙︾鐨勫尯鍩焛d涔熻褰曚笅鏉�)
+						if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(sdkNames, sdkName) {
 							sdkNames = sdkName + ","
+							polygonId = groupRule.Rules[j].PolygonId + ","
+						}
+						if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(polygonId, groupRule.Rules[j].PolygonId) {
+							polygonId = groupRule.Rules[j].PolygonId + ","
 						}
 						resultSplice = append(resultSplice, &ruleResult)
 					}
@@ -357,8 +352,11 @@
 					ruleResult := transferParameters(groupRule.Rules[j], areaMap)
 					if ruleResult.Result != "" {
 						logger.Info("鏁伴噺瑙勫垯缁撴灉锛�", ruleResult.Result)
-						if ruleResult.Result == "true" && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(sdkNames, sdkName) {
+						if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(sdkNames, sdkName) {
 							sdkNames = sdkName + ","
+						}
+						if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(polygonId, groupRule.Rules[j].PolygonId) {
+							polygonId = groupRule.Rules[j].PolygonId + ","
 						}
 						resultSplice = append(resultSplice, &ruleResult)
 					}
@@ -380,8 +378,11 @@
 					ruleResult := timeRuleResult(groupRule.Rules[j], areaMap)
 					if ruleResult.Result != "" {
 						logger.Info("鏃堕棿瑙勫垯缁撴灉锛�", ruleResult.Result)
-						if ruleResult.Result == "true" && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(sdkNames, sdkName) {
+						if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(sdkNames, sdkName) {
 							sdkNames = sdkName + ","
+						}
+						if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(polygonId, groupRule.Rules[j].PolygonId) {
+							polygonId = groupRule.Rules[j].PolygonId + ","
 						}
 						resultSplice = append(resultSplice, &ruleResult)
 					}
@@ -485,7 +486,7 @@
 					}
 				}
 				if sdkNames != "" {
-					args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkNames, groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText, locations})
+					args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkNames, groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText, locations,polygonId})
 					logger.Info("-------------------yolo缁撴灉鏍囩", args.RuleResult["yolo"].([]Result))
 				}
 				if args.RuleResult["face"] != nil {
@@ -500,7 +501,7 @@
 		return false
 	}
 }
-func TimerAlarm(groupId string) (int){
+func TimerAlarm(groupId string) (int) {
 	var flagTime int = 0
 	for k, timeEle := range TimeEleList {
 		if strings.Contains(k, groupId) {
@@ -657,7 +658,7 @@
 				result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋�
 				if result.(bool) {
 					logger.Info("___________________________________________________________________鑱斿姩浠诲姟鎶ヨ")
-					args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, "", groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText, []Rect{}})
+					args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, "", groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText, []Rect{},""})
 					logger.Info("-------------------yolo缁撴灉鏍囩鏈夊嚑涓�", len(args.RuleResult["yolo"].([]Result)))
 					if args.RuleResult["face"] != nil {
 						logger.Info("-------------------face缁撴灉鏍囩鏈夊嚑涓�", len(args.RuleResult["face"].([]Arg)))
diff --git a/util/simpleCV.go b/util/simpleCV.go
index 04c9340..7f07bff 100644
--- a/util/simpleCV.go
+++ b/util/simpleCV.go
@@ -3,21 +3,14 @@
 import (
 	"basic.com/pubsub/protomsg.git"
 	"bufio"
-	"bytes"
-	"encoding/json"
-	"errors"
 	"fmt"
 	"gocv.io/x/gocv"
 	"image"
 	"image/color"
-	"io"
-	"log"
-	"mime/multipart"
-	"net/http"
 	"os"
 	"ruleprocess/cache"
 	"ruleprocess/ruleserver"
-	"time"
+	"strings"
 )
 
 func CvRTSP() {
@@ -168,83 +161,27 @@
 	defer rook.Close()
 
 	red := color.RGBA{255, 0, 0, 0}
-	// 鏌ュ埌鎽勫儚鏈烘墍鏈夌殑鍖哄煙骞剁敾妗�
-	var cameraPolygons []protomsg.CameraPolygon
-	cameraPolygons = cache.GetPolygonsByCameraId(cameraId)
-	for _, polygon := range cameraPolygons {
-		points := ruleserver.Json2points(polygon.Polygon)
-		for index := 0; index < len(points); index++ {
-			if index == len(points)-1 { // 闂悎鍥惧舰
-				gocv.Line(&rook, image.Pt(int(points[index].X), int(points[index].Y)), image.Pt(int(points[0].X), int(points[0].Y)), red, 2)
-			} else {
-				gocv.Line(&rook, image.Pt(int(points[index].X), int(points[index].Y)), image.Pt(int(points[index+1].X), int(points[index+1].Y)), red, 2)
-			}
+	green := color.RGBA{0, 255, 0, 0}
 
+	// 鍒嗗壊鍖哄煙id闆嗗悎骞舵牴鎹甶d鏌ヨ鍖哄煙鐒跺悗鐢绘
+	for _,result := range results  {
+		polygonIds := strings.Split(result.AlarmPolygon,"")
+		for i := 0; i < len(polygonIds)-1; i++ {
+			polygon := getPolygonById(polygonIds[i],cameraId)
+			if polygon.Polygon != "" {
+				DrawAPolygon(&rook,polygon.Polygon,red)
+			}
 		}
 	}
 	// 鎶婄洰鏍囨鍑烘潵
 	for _,result := range results  {
 		for _,rect := range result.Location {
-			gocv.Rectangle(&rook, image.Rect(int(rect.X), int(rect.Y), int(rect.X+rect.Width), int(rect.Y+rect.Height)), red, 1)
+			gocv.Rectangle(&rook, image.Rect(int(rect.X), int(rect.Y), int(rect.X+rect.Width), int(rect.Y+rect.Height)), green, 1)
 		}
 	}
 	//return nil,nil
-	// 涓婁紶
-	fdata, _ := gocv.IMEncode(".jpg", rook)
-	body := &bytes.Buffer{}
-	writer := multipart.NewWriter(body)
-	_, err1 := writer.CreateFormFile("file", "fasjuierf")
-	if err1 != nil {
-		return nil, err1
-	}
-	boundary := writer.Boundary()
-	//close_string := fmt.Sprintf("\r\n--%s--\r\n", boundary)
-	close_buf := bytes.NewBufferString(fmt.Sprintf("\r\n--%s--\r\n", boundary))
-	file := bytes.NewBuffer(fdata)
-	request_reader := io.MultiReader(body, file, close_buf)
-	//_, err = io.Copy(part, file)
-	//writer.WriteField(key, val)
-	request, err := http.NewRequest("POST", "http://192.168.1.182:6333/submit", request_reader)
-	request.Header.Add("Content-Type", writer.FormDataContentType())
-	timeout := time.Duration(5 * time.Second) //瓒呮椂鏃堕棿50ms
-	client := &http.Client{Timeout: timeout}
-	resp, err := client.Do(request)
-	if err != nil {
-		log.Fatal(err)
-		return nil, err
-	}
-	defer func() {
-		if r := recover(); r != nil {
-			fmt.Printf("panic鐨勫唴瀹�%v\n", r)
-			msg := "涓婁紶鍥剧墖鏈嶅姟鍣ㄥ紓甯�"
-			if _, ok := r.(error); ok {
-				msg = r.(error).Error()
-				fmt.Println("panic--recover()寰楀埌鐨勬槸error绫诲瀷")
-			}
-			if _, ok := r.(string); ok {
-				msg = r.(string)
-				fmt.Println("panic--recover()寰楀埌鐨勬槸string绫诲瀷")
-			}
-			err0 = errors.New(msg)
-		}
-	}()
-	defer resp.Body.Close()
-	{
-		body := &bytes.Buffer{}
-		_, err := body.ReadFrom(resp.Body)
-		if err != nil {
-			log.Fatal(err)
-		}
-		fmt.Println(resp.StatusCode)
-		//fmt.Println(resp.Header)
-		fmt.Println(body)
-		//decoder := json.NewDecoder(strings.NewReader(body.String()))
-		decoder := make(map[string]interface{})
-		if err := json.Unmarshal([]byte(body.String()), &decoder); err != nil {
-			return nil, err
-		}
-		return decoder, nil
-	}
+	maps,err0 = UploadFromMat(rook)
+	return
 }
 
 // 鎶婂浘鐗囪浆鎴愪簩杩涘埗娴�
@@ -269,3 +206,26 @@
 
 	return bytes, err
 }
+// 鏍规嵁id鍘荤紦瀛橀噷鏌ヨ澶氳竟褰�
+func getPolygonById(polygonId string, cameraId string) (protomsg.CameraPolygon){
+	// 鏌ュ埌鎽勫儚鏈烘墍鏈夌殑鍖哄煙骞剁敾妗�
+	var cameraPolygons []protomsg.CameraPolygon
+	cameraPolygons = cache.GetPolygonsByCameraId(cameraId)
+	for _, polygon := range cameraPolygons {
+		if polygon.Id == polygonId {
+			return polygon
+		}
+	}
+	return protomsg.CameraPolygon{}
+}
+// 鍦ㄥ浘涓婄敾涓�涓
+func DrawAPolygon(rook *gocv.Mat,polygonString string, color color.RGBA) {
+	points := ruleserver.Json2points(polygonString)
+	for index := 0; index < len(points); index++ {
+		if index == len(points)-1 { // 闂悎鍥惧舰
+			gocv.Line(rook, image.Pt(int(points[index].X), int(points[index].Y)), image.Pt(int(points[0].X), int(points[0].Y)), color, 2)
+		} else {
+			gocv.Line(rook, image.Pt(int(points[index].X), int(points[index].Y)), image.Pt(int(points[index+1].X), int(points[index+1].Y)), color, 2)
+		}
+	}
+}
diff --git a/util/upload.go b/util/upload.go
index a5e4870..90e2d0d 100644
--- a/util/upload.go
+++ b/util/upload.go
@@ -135,4 +135,63 @@
 		}
 		return decoder, nil
 	}
+}
+
+func UploadFromMat(rook gocv.Mat)(maps map[string]interface{}, err0 error){
+	// 涓婁紶
+	fdata, _ := gocv.IMEncode(".jpg", rook)
+	body := &bytes.Buffer{}
+	writer := multipart.NewWriter(body)
+	_, err1 := writer.CreateFormFile("file", "fasjuierf")
+	if err1 != nil {
+		return nil, err1
+	}
+	boundary := writer.Boundary()
+	//close_string := fmt.Sprintf("\r\n--%s--\r\n", boundary)
+	close_buf := bytes.NewBufferString(fmt.Sprintf("\r\n--%s--\r\n", boundary))
+	file := bytes.NewBuffer(fdata)
+	request_reader := io.MultiReader(body, file, close_buf)
+	//_, err = io.Copy(part, file)
+	//writer.WriteField(key, val)
+	request, err := http.NewRequest("POST", "http://192.168.1.182:6333/submit", request_reader)
+	request.Header.Add("Content-Type", writer.FormDataContentType())
+	timeout := time.Duration(5 * time.Second) //瓒呮椂鏃堕棿50ms
+	client := &http.Client{Timeout: timeout}
+	resp, err := client.Do(request)
+	if err != nil {
+		log.Fatal(err)
+		return nil, err
+	}
+	defer func() {
+		if r := recover(); r != nil {
+			fmt.Printf("panic鐨勫唴瀹�%v\n", r)
+			msg := "涓婁紶鍥剧墖鏈嶅姟鍣ㄥ紓甯�"
+			if _, ok := r.(error); ok {
+				msg = r.(error).Error()
+				fmt.Println("panic--recover()寰楀埌鐨勬槸error绫诲瀷")
+			}
+			if _, ok := r.(string); ok {
+				msg = r.(string)
+				fmt.Println("panic--recover()寰楀埌鐨勬槸string绫诲瀷")
+			}
+			err0 = errors.New(msg)
+		}
+	}()
+	defer resp.Body.Close()
+	{
+		body := &bytes.Buffer{}
+		_, err := body.ReadFrom(resp.Body)
+		if err != nil {
+			log.Fatal(err)
+		}
+		fmt.Println(resp.StatusCode)
+		//fmt.Println(resp.Header)
+		fmt.Println(body)
+		//decoder := json.NewDecoder(strings.NewReader(body.String()))
+		decoder := make(map[string]interface{})
+		if err := json.Unmarshal([]byte(body.String()), &decoder); err != nil {
+			return nil, err
+		}
+		return decoder, nil
+	}
 }
\ No newline at end of file

--
Gitblit v1.8.0