package insertdata import ( "encoding/json" "errors" "fmt" "net" "ruleprocess/cache" "ruleprocess/logger" "strings" "time" "basic.com/pubsub/protomsg.git" "github.com/golang/protobuf/proto" "github.com/satori/go.uuid" "ruleprocess/ruleserver" "ruleprocess/util" ) var weedfsUrl = "http://192.168.1.182:6333/submit" // 人脸的数据结构 type PerVideoPicture struct { Id string `json:"id"` CameraId string `json:"cameraId"` CameraAddr string `json:"cameraAddr"` PicDate string `json:"picDate"` PicMaxUrl string `json:"picMaxUrl"` TaskId string `json:"taskId"` TaskName string `json:"taskName"` SdkName string `json:"sdkName"` Content string `json:"content"` LikeDate string `json:"likeDate"` Sex string `json:"sex"` Age int32 `json:"age"` AgeDescription string `json:"ageDescription"` Race string `json:"race"` SmileLevel int32 `json:"smileLevel"` BeautyLevel int32 `json:"beautyLevel"` FaceFeature string `json:"faceFeature"` PicSmUrl []string `json:"picSmUrl"` VideoUrl string `json:"videoUrl"` AnalyServerId string `json:"analyServerId"` AnalyServerName string `json:"analyServerName"` AnalyServerIp string `json:"analyServerIp"` ClusterId string `json:"clusterId"` IsAlarm int `json:"isAlarm"` IsAckAlarm int `json:"isAckAlarm"` IsCollect int `json:"isCollect"` IsDelete int `json:"isDelete"` BaseInfo []Base `json:"baseInfo"` } type Base struct { TableId string `json:"tableId"` TableName string `json:"tableName"` CompareScore float64 `json:"compareScore"` PersonId string `json:"personId"` PersonName string `json:"personName"` PersonPicUrl string `json:"personPicUrl"` PhoneNum string `json:"phoneNum"` Sex string `json:"sex"` IdCard string `json:"idCard"` MonitorLevel string `json:"monitorLevel"` Content string `json:"content"` } // yolo行为的数据结构 type Personaction struct { Id string `json:"id"` CameraId string `json:"cameraId"` CameraName string `json:"cameraName"` CameraAddr string `json:"cameraAddr"` TaskId string `json:"taskId"` TaskName string `json:"taskName"` SdkName string `json:"sdkName"` Content string `json:"content"` AlarmRules []AlarmRule `json:"alarmRules"` AnalyServerId string `json:"analyServerId"` AnalyServerName string `json:"analyServerName"` AnalyServerIp string `json:"analyServerIp"` ClusterId string `json:"clusterId"` PicSmUrl []string `json:"picSmUrl"` PicDate string `json:"picDate"` VideoUrl string `json:"videoUrl"` IsAlarm int `json:"isAlarm"` IsAckAlarm int `json:"isAckAlarm"` IsCollect int `json:"isCollect"` IsDelete int `json:"isDelete"` } type AlarmRule struct { GroupId string `json:"groupId"` AlarmLevel string `json:"alarmLevel"` RuleText string `json:"ruleText"` } // 往ES插数据 func InsertToEs(msg ruleserver.ResultMsg) { // 直接从规则的标签数据里拿符合规则的人脸结果 if msg.RuleResult["face"] != nil && len(msg.RuleResult["face"].([]ruleserver.Arg)) > 0 { logger.Info("往ES插人脸数据") for _, face := range msg.RuleResult["face"].([]ruleserver.Arg) { // 上传大图 // 解压缩并上传图片 bdata, err := util.UnCompress(msg.Data) if err != nil { panic("解压缩图片时出现错误") } i := protomsg.Image{} err = proto.Unmarshal(bdata, &i) bigPhotoUrl := make(map[string]interface{}) bigPhotoUrl, err = util.PostFormBufferData(weedfsUrl, i, uuid.NewV4().String()) fmt.Println(bigPhotoUrl) if len(face.Liker) == 0 { // 人脸检测,没有相似的底库人员 localConfig, err := cache.GetServerInfo() if err != nil { logger.Info("查询本机信息失败!") } serverIp, err := GetLocalIP() // 解压缩并上传图片 bdata, err := util.UnCompress(msg.Data) if err != nil { panic("解压缩图片时出现错误") } // 查询cameraName camera, err := cache.GetCameraById(msg.Cid) if err != nil { logger.Info("查询摄像机信息失败") } i := protomsg.Image{} err = proto.Unmarshal(bdata, &i) logger.Info("-------------------------------------------看下宽和高", i.Width, i.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 { logger.Info("上传小图出错") } sex := "" if face.ThftRes.Gender == 1 { sex = "男" } else { sex = "女" } race := getRaceString(face.ThftRes.Race) ageDescription := getDescription(face.ThftRes.Age) pervideo := PerVideoPicture{ uuid.NewV4().String(), msg.Cid, camera.Addr, time.Now().Format("2006-01-02 15:04:05"), strings.Split(bigPhotoUrl["fileUrl"].(string), "/")[1], msg.Tasklab.Taskid, msg.Tasklab.Taskname, "人脸", "", time.Now().Format("2006-01-02 15:04:05"), // 只检测,没有比对时间 sex, face.ThftRes.Age, ageDescription, race, face.ThftRes.Smile, face.ThftRes.Beauty, "不是每个人脸算法都有", []string{strings.Split(resp["fileUrl"].(string), "/")[1]}, "暂无集群", localConfig.ServerId, localConfig.ServerName, serverIp, "", 1, 0, 0, 0, []Base{}, } requstbody, err := json.Marshal(pervideo) if err != nil { logger.Info("json parse error ", err) return } err = EsReq("POST", "http://192.168.1.182:9200/videopersons/perVideoPicture", requstbody) logger.Info(err.Error()) } else { logger.Info("跟底库的相似数据---------:", face.Liker) } } } if msg.RuleResult["yolo"] != nil && len(msg.RuleResult["yolo"].([]ruleserver.Result)) > 0 { logger.Info("往ES插yolo数据") var sdkNames string = "" alarmRules := []AlarmRule{} for _, yoloResult := range msg.RuleResult["yolo"].([]ruleserver.Result) { sdkNames = sdkNames + yoloResult.SdkName alarm := ChangeToString(yoloResult.AlarmLevel) alarmRules = append(alarmRules, AlarmRule{yoloResult.RuleGroupId, alarm, yoloResult.RuleText}) } isAlarm := 0 resp := make(map[string]interface{}) if len(alarmRules) > 0 { isAlarm = 1 // 解压缩并上传图片 bdata, err := util.UnCompress(msg.Data) if err != nil { panic("解压缩图片时出现错误") } i := protomsg.Image{} err = proto.Unmarshal(bdata, &i) //resp, err = util.PostFormBufferData(weedfsUrl, i, uuid.NewV4().String()) resp, err = util.DrawPolygonOnImage(msg.Cid, i,msg.RuleResult["yolo"].([]ruleserver.Result)) if err != nil { logger.Info("画框或上传图片服务器出错", err) } else { logger.Info("已报警并上传改帧图片到服务器") } } else { isAlarm = 0 // 不是报警数据不存 return } // logger.Println("图片上传返回值:", resp) // 查询本机信息 localConfig, err := cache.GetServerInfo() if err != nil { logger.Info("查询本机信息失败!") } // 查询cameraName camera, err := cache.GetCameraById(msg.Cid) if err != nil { logger.Info("查询摄像机信息失败") } serverIp, err := GetLocalIP() peraction := Personaction{ uuid.NewV4().String(), msg.Cid, camera.Name, camera.Addr, msg.Tasklab.Taskid, msg.Tasklab.Taskname, sdkNames, "", alarmRules, localConfig.ServerId, localConfig.ServerName, serverIp, "", []string{strings.Split(resp["fileUrl"].(string), "/")[1]}, time.Now().Format("2006-01-02 15:04:05"), "", isAlarm, 0, 0, 0, } requstbody, err := json.Marshal(peraction) if err != nil { logger.Info("json parse error ", err) return } err = EsReq("POST", "http://192.168.1.182:9200/personaction/perVideoAction", requstbody) if err != nil { logger.Info("往ES插入数据失败", err) } else { logger.Info("__________________________________________往ES插入yolo数据成功") } } } // 获取本机ip func GetLocalIP() (ipv4 string, err error) { var ( addrs []net.Addr addr net.Addr ipNet *net.IPNet // IP地址 isIpNet bool ) // 获取所有网卡 if addrs, err = net.InterfaceAddrs(); err != nil { return } // 取第一个非lo的网卡IP for _, addr = range addrs { // 这个网络地址是IP地址: ipv4, ipv6 if ipNet, isIpNet = addr.(*net.IPNet); isIpNet && !ipNet.IP.IsLoopback() { // 跳过IPV6 if ipNet.IP.To4() != nil { ipv4 = ipNet.IP.String() // 192.168.1.1 return } } } err = errors.New("ipv4 not found") return } // 把报警等级转化成汉字 func ChangeToString(i int32) string { alarm := "" if i == 1 { alarm = "一级" } if i == 2 { alarm = "二级" } if i == 3 { alarm = "三级" } if i == 4 { alarm = "四级" } if i == 5 { alarm = "五级" } return alarm } //获取年龄描述 func getDescription(age int32) string { ageInfo := "青年" if age > 0 && age < 7 { ageInfo = "童年" } else if age >= 7 && age < 18 { ageInfo = "少年" } else if age >= 18 && age < 40 { ageInfo = "青年" } else if age >= 40 && age < 65 { ageInfo = "中年" } else if age >= 65 { ageInfo = "老年" } return ageInfo } func getRaceString(i int32) string { race := "" if i == 1 { race = "白人" } else if i == 2 { race = "黄人" } else { race = "黑人" } return race }