From 0222e79afe45d9fc55aed9a7e62ca239c228ab73 Mon Sep 17 00:00:00 2001 From: 554325746@qq.com <554325746@qq.com> Date: 星期一, 23 十二月 2019 10:24:12 +0800 Subject: [PATCH] add sys comeback sh --- controllers/fileController.go | 649 +++++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 437 insertions(+), 212 deletions(-) diff --git a/controllers/fileController.go b/controllers/fileController.go index 8ebc80c..32fefb3 100644 --- a/controllers/fileController.go +++ b/controllers/fileController.go @@ -6,11 +6,14 @@ "basic.com/pubsub/protomsg.git" "bytes" "encoding/base64" + "encoding/json" "errors" "fmt" "github.com/gin-gonic/gin" "github.com/satori/go.uuid" + "gocv.io/x/gocv" "image" + "image/color" "image/jpeg" "io/ioutil" "log" @@ -22,10 +25,11 @@ "strings" "sync" "time" + "webserver/cache" "webserver/extend/code" "webserver/extend/config" "webserver/extend/esutil" - "webserver/extend/logger" + "basic.com/valib/logger.git" "webserver/extend/util" "webserver/models" "webserver/service" @@ -46,9 +50,10 @@ //var weedfsUri = "http://192.168.1.182:9500/submit" +// @Security ApiKeyAuth // @Summary 渚濇嵁鍥剧墖娣诲姞搴曞簱浜哄憳 // @Description 渚濇嵁鍥剧墖娣诲姞搴曞簱杩斿洖鏁版嵁浜哄憳 -// @Accept mpfd +// @Accept multipart/form-data // @Produce json // @Tags dbperson 搴曞簱浜哄憳 // @Param file formData file true "搴曞簱浜哄憳鍥剧墖" @@ -106,8 +111,10 @@ } var faceExtractedMap = make(map[string]FaceExtract,0) +// @Security ApiKeyAuth // @Summary 浜鸿劯鎻愬彇 // @Description 浜鸿劯鎻愬彇 +// @Accept multipart/form-data // @Produce json // @Tags 浠ュ浘鎼滃浘 // @Param file formData file true "浜哄憳鍥剧墖" @@ -120,7 +127,13 @@ util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") return } - var weedfsUri = "http://"+config.WeedFs.Ip+":"+strconv.Itoa(config.WeedFs.UploadPort)+"/submit" + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + return + } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit" + logger.Debug("weedfsUri:",weedfsUri) resultMap :=make(map[string]interface{},0) //灏嗕笂浼犵殑鍥剧墖浜や汉鑴告娴嬪拰浜鸿劯鎻愬彇锛岃幏寰楃壒寰� fileBytes, _ := ioutil.ReadAll(file) @@ -141,7 +154,9 @@ } } //2.澶у浘鐢绘,鏍囪瘑浜鸿劯浣嶇疆 - originFilePath, _ := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", fileBytes) + drawedB, _ := drawPolygonOnImg(pI, &faceArr) + + originFilePath, _ := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", *drawedB) resultMap["uploadImage"] = originFilePath resultMap["smImage"] = urlArr util.ResponseFormat(c,code.Success, resultMap) @@ -150,158 +165,222 @@ } } +func drawPolygonOnImg(i *protomsg.Image,faceArr *[]*protomsg.ResultFaceDetect) (*[]byte,error) { + rook, _ := gocv.NewMatFromBytes(int(i.Height), int(i.Width), gocv.MatTypeCV8UC3, i.Data) + defer rook.Close() + //yellow := color.RGBA{255, 255, 0, 0} + red := color.RGBA{255, 0, 0, 0} + for _,faceResult := range *faceArr { + left := int(faceResult.Pos.RcFace.Left) + top := int(faceResult.Pos.RcFace.Top) + right := int(faceResult.Pos.RcFace.Right) + bottom := int(faceResult.Pos.RcFace.Bottom) + gocv.Rectangle(&rook, image.Rect(left,top,right,bottom), red, 1) + } + fData,err := gocv.IMEncode(".jpg", rook) + return &fData,err +} + type CompareResult struct { Id string `json:"id"` - CompareScore float32 `json:"compareScore"` + CompareScore float64 `json:"compareScore"` CameraId string `json:"cameraId"` + CameraName string `json:"cameraName"` CameraAddr string `json:"cameraAddr"` PicDate string `json:"picDate"` Content string `json:"content"` - IsAlarm int `json:"isAlarm"` - PicMaxUrl string `json:"picMaxUrl"` - PicSmUrl []string `json:"picSmUrl"` - Sex string `json:"sex"` - AgeDescription string `json:"ageDescription"` - Race string `json:"race"` + IsAlarm bool `json:"isAlarm"` + PicMaxUrl []string `json:"picMaxUrl"` + TargetInfo []TargetInfo `json:"targetInfo"` TaskId string `json:"taskId"` TaskName string `json:"taskName"` BaseInfo []DbPersonVo `json:"baseInfo"` VideoUrl string `json:"videoUrl"` SdkName string `json:"sdkName"` + AlarmRules []AlarmRuleVo `json:"alarmRules"` } + +type TargetInfo struct { + TargetId string `json:"targetId"` + TargetType string `json:"targetType"` + TargetScore float64 `json:"targetScore"` + Feature string `json:"feature"` + PicSmUrl string `json:"picSmUrl"` + TargetLocation TargetLocation `json:"targetLocation"` +} + +type TargetLocation struct { + TopLeft protomsg.Location `json:"topLeft"` + BottomRight protomsg.Location `json:"bottomRight"` +} + type DbPersonVo struct { - BwType string `json:"bwType"` - CompareScore float32 `json:"compareScore"` - IdCard string `json:"idCard"` - MonitorLevel string `json:"monitorLevel"` - PersonId string `json:"personId"` - PersonName string `json:"personName"` - PersonPicUrl string `json:"personPicUrl"` - PhoneNum string `json:"phoneNum"` - Sex string `json:"sex"` TableId string `json:"tableId"` TableName string `json:"tableName"` + BwType string `json:"bwType"` + CompareScore float64 `json:"compareScore"` + TargetId string `json:"targetId"` + TargetName string `json:"targetName"` + TargetPicUrl string `json:"targetPicUrl"` + MonitorLevel string `json:"monitorLevel"` + Labels string `json:"labels"` + Content string `json:"content"` Enable int32 `json:"enable"` } -type CompareSortResult []CompareResult +type ScoreIndex struct { + CompareScore float64 + Index int +} -func (s CompareSortResult) Len() int{ - return len(s) -} -func (s CompareSortResult) Swap(i,j int){ - s[i],s[j] = s[j],s[i] -} -func (s CompareSortResult) Less(i,j int) bool{ - return s[i].CompareScore > s[j].CompareScore +type AlarmRuleVo struct { + GroupId string `json:"groupId"` + AlarmLevel string `json:"alarmLevel"` + RuleText string `json:"ruleText"` + DefenceState bool `json:"defenceState"` + IsLink bool `json:"isLink"` + LinkInfo string `json:"linkInfo"` } //濉厖鍚戝墠绔繑鍥炵殑鏁版嵁 -func FillDataToCompareResult(compResult *protomsg.SdkCompareResult) CompareSortResult { - //resultList :=make([]CompareResult,0) - var resultList = CompareSortResult{} +func FillDataToCompareResult(compResult *protomsg.SdkCompareResult) []CompareResult { - dbPersonM := make(map[string]*protomsg.SdkCompareEach, 0) - captureM := make(map[string]*protomsg.SdkCompareEach, 0) + var resultList = make([]CompareResult, len(compResult.CompareResult)) + dbPersonM := make(map[string]ScoreIndex, 0) + captureM := make(map[string]ScoreIndex, 0) personIds := make([]string,0) captureIds := make([]string,0) - for _,v :=range compResult.CompareResult{ + for idx,v :=range compResult.CompareResult{ if v.Tableid == service.CaptureTable { - captureM[v.Id] = v + captureM[v.Id] = ScoreIndex{ + Index: idx, + CompareScore: util.ParseScore64(float64(v.CompareScore)), + } captureIds = append(captureIds,v.Id) } else { - dbPersonM[v.Id] = v + dbPersonM[v.Id] = ScoreIndex{ + Index: idx, + CompareScore: util.ParseScore64(float64(v.CompareScore)), + } personIds = append(personIds,v.Id) } } logger.Debug("comp len(personIds):", len(personIds)) logger.Debug("comp len(captureIds):", len(captureIds)) - esServerIp := config.EsInfo.Masterip - esServerPort := config.EsInfo.Httpport - index := config.EsInfo.EsIndex.Dbtablepersons.IndexName + var dbpersons []protomsg.Dbperson if len(personIds) >0 { - dbpersons, _ = esApi.Dbpersoninfosbyid(personIds, index, esServerIp, esServerPort) + var dbpApi dbapi.DbPersonApi + dbpersons, _ = dbpApi.Dbpersoninfosbyid(personIds) } if len(dbpersons) >0 { + var dtApi dbapi.DbTableApi for _,p :=range dbpersons { var dbP = DbPersonVo { - PersonId: p.Id, - IdCard: p.IdCard, - CompareScore: util.ParseScore(dbPersonM[p.Id].CompareScore), + TargetId: p.Id, + CompareScore: dbPersonM[p.Id].CompareScore, MonitorLevel: p.MonitorLevel, - PersonName: p.PersonName, - PersonPicUrl: p.PersonPicUrl, - PhoneNum: p.PhoneNum, - Sex: p.Sex, + TargetName: p.PersonName, + TargetPicUrl: p.PersonPicUrl, + Labels: p.PhoneNum+"/"+p.Sex+"/"+p.IdCard, TableId: p.TableId, + Content: p.Reserved, Enable: p.Enable, } - dbTableInfos, _ := esApi.Dbtablefosbyid([]string{p.TableId}, config.EsInfo.EsIndex.DbTables.IndexName, esServerIp, esServerPort) + dbTableInfos, _ := dtApi.DbtablesById([]string{ p.TableId }) if dbTableInfos !=nil{ dbP.BwType = dbTableInfos[0].BwType dbP.TableName = dbTableInfos[0].TableName } - var cr = CompareResult{ + + resultList[dbPersonM[p.Id].Index] = CompareResult{ BaseInfo:[]DbPersonVo{ dbP }, } - resultList = append(resultList,cr) } } if len(captureIds) >0 { - videopersons, _ := esApi.Videopersonsinfosbyid(captureIds, config.EsInfo.EsIndex.VideoPersons.IndexName, config.EsInfo.Masterip, config.EsInfo.Httpport) - logger.Debug("comp videoPersons.len:",len(videopersons)) - for _,vp :=range videopersons { - isAlarmInt, _ := strconv.Atoi(vp.IsAlarm) - bi := make([]DbPersonVo,0) + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.AlarmIp == "" || localConf.ServerId == "" { + logger.Debug("localConfig is wrong!!!") + return nil + } + logger.Debug("captureIds:",strings.Join(captureIds,",")) + aiTargets, _ := esApi.AIOceaninfosbyid(captureIds, config.EsInfo.EsIndex.AiOcean.IndexName, localConf.AlarmIp, strconv.Itoa(int(localConf.AlarmPort))) + logger.Debug("comp aiTargets.len:",len(aiTargets)) + for _,vp :=range aiTargets { + var bi []DbPersonVo for _,p :=range vp.BaseInfo { bi = append(bi, DbPersonVo{ - PersonId: p.PersonId, - IdCard: p.IdCard, - CompareScore: util.ParseScore(p.CompareScore), - MonitorLevel: parseMonitorLevel(p.MonitorLevel), - PersonName: p.PersonName, - PersonPicUrl: p.PersonPicUrl, - PhoneNum: p.PhoneNum, - Sex: p.Sex, + TargetId: p.TargetId, + CompareScore: util.ParseScore64(p.CompareScore), + MonitorLevel: p.MonitorLevel, + TargetName: p.TargetName, + TargetPicUrl: p.TargetPicUrl, + Labels: p.Labels, TableId: p.TableId, - BwType: strconv.Itoa(int(p.BwType)), + BwType: p.BwType, TableName: p.TableName, }) } + var alarmRules []AlarmRuleVo + if vp.AlarmRules !=nil && len(vp.AlarmRules) >0 { + for _,ar :=range vp.AlarmRules { + alarmRules = append(alarmRules, AlarmRuleVo{ + GroupId: ar.GroupId, + AlarmLevel: ar.AlarmLevel, + RuleText: ar.RuleText, + DefenceState: ar.DefenceState, + IsLink: ar.IsLink, + LinkInfo: ar.LinkInfo, + }) + } + } + var ti = make([]TargetInfo,0) + if vp.TargetInfo !=nil { + for _,vti :=range vp.TargetInfo { + tl := protomsg.Location{ + X: vti.TargetLocation.TopLeft.X, + Y: vti.TargetLocation.TopLeft.Y, + } + br := protomsg.Location{ + X: vti.TargetLocation.BottomRight.X, + Y: vti.TargetLocation.BottomRight.Y, + } + tInfo := TargetInfo{ + TargetId: vti.TargetId, + TargetType: vti.TargetType, + TargetScore: vti.TargetScore, + Feature: vti.Feature, + PicSmUrl: vti.PicSmUrl, + TargetLocation: TargetLocation{ + TopLeft:tl, + BottomRight:br, + }, + } + ti = append(ti, tInfo) + } + } vpE := CompareResult{ Id: vp.Id, - CompareScore: util.ParseScore(captureM[vp.Id].CompareScore), + CompareScore: captureM[vp.Id].CompareScore, CameraId: vp.CameraId, + CameraName: vp.CameraName, CameraAddr: vp.CameraAddr, PicDate: vp.PicDate, PicMaxUrl: vp.PicMaxUrl, - PicSmUrl: vp.PicSmUrl, - IsAlarm: isAlarmInt, - Sex: vp.Sex, - AgeDescription: vp.AgeDescription, - Race: vp.Race, + TargetInfo: ti, + IsAlarm: vp.IsAlarm, TaskName: vp.TaskName, TaskId: vp.TaskId, VideoUrl: vp.VideoUrl, BaseInfo: bi, SdkName: "浜鸿劯", + AlarmRules: alarmRules, } - resultList = append(resultList,vpE) + resultList[captureM[vp.Id].Index] = vpE } } - var scorePre []float32 - for _,f1 :=range resultList { - scorePre = append(scorePre, f1.CompareScore) - } - logger.Debug("comp 鎺掑簭鍓嶅垎鍊兼暟缁勶細",scorePre) - sort.Sort(resultList) - var scoreAf []float32 - for _,f2 :=range resultList { - scoreAf = append(scoreAf, f2.CompareScore) - } - logger.Debug("comp 鎺掑簭鍚庡垎鍊兼暟缁勶細",scoreAf) return resultList } @@ -318,6 +397,37 @@ return level } +func GetFeaFromOneFaceImg(fileBytes []byte) (faceB []byte,oriImg string,smImgs []string, err error){ + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + return nil,"",nil,errors.New("localConf err") + } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit" + logger.Debug("weedfsUri:",weedfsUri) + faceArr, err, pI := service.GetFaceFeaFromSdk(fileBytes, time.Second*60) + if err ==nil && len(faceArr) ==1 { + rcFace := faceArr[0].Pos.RcFace + cutFaceImgData := util.SubImg(*pI, int(rcFace.Left), int(rcFace.Top), int(rcFace.Right), int(rcFace.Bottom)) + weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", cutFaceImgData) + if e == nil{ + faceExtractedMap[weedFilePath] = FaceExtract{ + Url:weedFilePath, + FaceBytes:faceArr[0].Feats, + } + smImgs = append(smImgs, weedFilePath) + } + //2.澶у浘鐢绘,鏍囪瘑浜鸿劯浣嶇疆 + drawedB, _ := drawPolygonOnImg(pI, &faceArr) + + originFilePath, _ := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", *drawedB) + return faceArr[0].Feats,originFilePath,smImgs,nil + } else { + return nil,"",nil,errors.New("no face") + } +} + +// @Security ApiKeyAuth // @Summary 浠ュ浘鎼滃浘 // @Description 浠ュ浘鎼滃浘 // @Accept json @@ -327,49 +437,70 @@ // @Success 200 {string} json "{"code":200, msg:"", data:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", data:"", success:false}" // @Router /data/api-v/dbperson/searchByPhoto [POST] -func (controller FileController) SearchByPhoto(c *gin.Context) { +func (fc FileController) SearchByPhoto(c *gin.Context) { var searchBody models.EsSearch err := c.BindJSON(&searchBody) if err !=nil{ util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") return } + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.AlarmIp == "" || localConf.ServerId == "" { + logger.Debug("localConfig is wrong!!!") + util.ResponseFormat(c,code.ComError,"localConf wrong") + return + } var faceB []byte - if searchBody.CaptureId != "" {//鍋氭煡鎵炬浜�,鎼滄墍鏈夋姄鎷嶅拰搴曞簱 - searchBase64Fea, err := esApi.GetVideoPersonFaceFeatureById(searchBody.CaptureId, config.EsInfo.EsIndex.VideoPersons.IndexName, config.EsInfo.Masterip, config.EsInfo.Httpport) - if err !=nil { - util.ResponseFormat(c, code.ComError, "鎶撴媿鏁版嵁涓嶅瓨鍦紝璇锋鏌�") - return - } - if searchBase64Fea !=""{ - decodeF, err := base64.StdEncoding.DecodeString(searchBase64Fea) - if err !=nil { - util.ResponseFormat(c, code.ComError, "鏈潯鎶撴�曠壒寰佷笉鏄痓ase64锛岃妫�鏌�") + logger.Debug("compTargetId:",searchBody.CompTargetId,",compTargetType:",searchBody.CompTargetType) + if searchBody.CompTargetId != "" {//鍋氭煡鎵炬浜�,鎸夋姄鎷嶇殑浜鸿劯鎴栬�呭簳搴撶殑浜鸿劯浠ュ浘鎼滃浘 + if searchBody.CompTargetType == 0 {//鏈紶浜鸿劯鏄簳搴撲汉鑴� + var dbpApi dbapi.DbPersonApi + dbPersons, e := dbpApi.Dbpersoninfosbyid([]string{searchBody.CompTargetId}) + if e ==nil && dbPersons !=nil && len(dbPersons) ==1 { + searchBase64Fea := dbPersons[0].FaceFeature + if searchBase64Fea != "" { + decodeF, err := base64.StdEncoding.DecodeString(dbPersons[0].FaceFeature) + if err !=nil { + util.ResponseFormat(c, code.ComError, "鏈潯搴曞簱浜哄憳鐗瑰緛涓嶆槸base64锛岃妫�鏌�") + return + } + faceB = decodeF + } else { + util.ResponseFormat(c, code.ComError, "鏈潯搴曞簱浜哄憳鐗瑰緛涓虹┖锛岃妫�鏌�") + return + } + } else { + util.ResponseFormat(c, code.ComError, "搴曞簱浜哄憳鏌ヨ澶辫触锛岃妫�鏌�") return } - faceB = decodeF + } else { + searchBase64Fea, err := esApi.GetVideoPersonFaceFeatureById(searchBody.CompTargetId, config.EsInfo.EsIndex.AiOcean.IndexName, localConf.AlarmIp, strconv.Itoa(int(localConf.AlarmPort))) + if err !=nil { + util.ResponseFormat(c, code.ComError, "鎶撴媿鏁版嵁涓嶅瓨鍦紝璇锋鏌�") + return + } + + if searchBase64Fea !=""{ + decodeF, err := base64.StdEncoding.DecodeString(searchBase64Fea) + if err !=nil { + util.ResponseFormat(c, code.ComError, "鏈潯鎶撴�曠壒寰佷笉鏄痓ase64锛岃妫�鏌�") + return + } + faceB = decodeF + } } + } else {//鍋氫互鍥炬悳鍥� if searchBody.PicUrl == "" || len(searchBody.DataBases) == 0 { - util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") + util.ResponseFormat(c, code.RequestParamError, "浠ュ浘鎼滃浘PicUrl涓嶈兘涓虹┖") return } if face,ok := faceExtractedMap[searchBody.PicUrl];!ok{ - util.ResponseFormat(c, code.RequestParamError, "璇烽噸鏂颁笂浼犲浘鐗�") + util.ResponseFormat(c, code.RequestParamError, "浜鸿劯鐗瑰緛鏈娴嬶紝璇烽噸鏂颁笂浼犲浘鐗�") return } else { faceB = face.FaceBytes } - } - - var sysSetApi dbapi.SysSetApi - analyServerId := "" - flag, sysconf := sysSetApi.GetServerInfo() - if flag { - analyServerId = sysconf.ServerId - } else { - util.ResponseFormat(c, code.ComError, "analyServerId涓虹┖锛岄厤缃湁璇�") - return } if faceB == nil { @@ -381,11 +512,12 @@ CompareThreshold: searchBody.Threshold, } + var hasCompEsPerson = false if searchBody.DataBases !=nil { for idx,tableId :=range searchBody.DataBases { if tableId == "esData" { searchBody.DataBases = append(searchBody.DataBases[:idx], searchBody.DataBases[idx+1:]...) - searchBody.DataBases = append(searchBody.DataBases,service.CaptureTable) + hasCompEsPerson = true break } } @@ -393,48 +525,54 @@ } else { arg.TableIds = []string{} } + alarmLevelTypes := strings.Replace(strings.Trim(fmt.Sprint(getAlarmLevel(searchBody.AlarmLevel)), "[]"), " ", "\",\"", -1) arg.Source = true // 鏍囪瘑鏉ユ簮鏄痺eb - arg.AlarmLevel = searchBody.AlarmLevel + arg.AlarmLevel = alarmLevelTypes arg.Tasks = searchBody.Tasks arg.TreeNodes = searchBody.TreeNodes arg.Tabs = searchBody.Tabs arg.SearchTime = searchBody.SearchTime arg.InputValue = searchBody.InputValue arg.Collection = searchBody.Collection - arg.AnalyServerId = analyServerId + arg.AnalyServerId = localConf.ServerId logger.Debug("arg.TableIds:", arg.TableIds, ",alarmLevel:",arg.AlarmLevel,",treeNodes:",arg.TreeNodes,",searchTime:",arg.SearchTime, ",inputValue:",arg.InputValue,",tasks:",arg.Tasks,",compThreshold:",arg.CompareThreshold) timeStart := time.Now() compareService := service.NewFaceCompareService(arg) - compareOnce := compareService.Compare() - totalData := compareOnce.CompareData + var totalData service.CompareList + if len(arg.TableIds) >0 {//鏈夋瘮瀵瑰簳搴� + dbPersonTargets := compareService.CompareDbPersons() + if dbPersonTargets !=nil { + totalData = append(totalData,*dbPersonTargets...) + } + } + if hasCompEsPerson {//鏈夋瘮瀵笶s鎶撴媿 + esPersons := compareService.CompareVideoPersons() + if esPersons !=nil { + totalData = append(totalData, *esPersons...) + } + } logger.Debug("comp 姣斿缁撴潫锛岀敤鏃讹細",time.Since(timeStart)) + service.SetCompResultByNum(&service.CompareOnce{ + CompareNum: compareService.CompareNum, + CompareData: &totalData, + }) + m := make(map[string]interface{},3) if totalData != nil && totalData.Len() > 0{ - //鎸夊垎鍊兼帓搴� - //var scorePre []float32 - //for _,f1 :=range *totalData { - // scorePre = append(scorePre, f1.CompareScore) - //} - //logger.Debug("comp 鎺掑簭鍓嶅垎鍊兼暟缁勶細",scorePre) sort.Sort(totalData) - //var scoreAf []float32 - //for _,f2 :=range *totalData { - // scoreAf = append(scoreAf, f2.CompareScore) - //} - //logger.Debug("comp 鎺掑簭鍚庡垎鍊兼暟缁勶細",scoreAf) total := totalData.Len() - m["compareNum"] = compareOnce.CompareNum + m["compareNum"] = compareService.CompareNum m["total"] = total var sCompResult protomsg.SdkCompareResult if total <= searchBody.Size { - sCompResult.CompareResult = *totalData + sCompResult.CompareResult = totalData } else { - sCompResult.CompareResult = (*totalData)[0:searchBody.Size] + sCompResult.CompareResult = totalData[0:searchBody.Size] } resultList := FillDataToCompareResult(&sCompResult) m["totalList"] = resultList @@ -442,82 +580,143 @@ } else { m["total"] = 0 - m["compareNum"] = searchBody.CompareNum + m["compareNum"] = compareService.CompareNum m["totalList"] = []CompareResult{} } util.ResponseFormat(c,code.Success,m) } -func GetCompareDataTwice(co *service.CompareOnce,arg *models.EsSearch) map[string]interface{} { - //camIds := arg.TreeNodes - //tabIds := arg.Tabs - //taskIds := arg.Tasks - //alarmLevels := arg.AlarmLevel - //timeArr := arg.SearchTime - //input := arg.InputValue - //resultList := make([]CompareResult,0) - //for _,each :=range *co.CompareData { - // if each.Id !=""{ - // n :=0 - // if len(camIds) == 0 || isInArr(each.CameraId,camIds) { - // n++ - // } - // if len(tabIds) == 0 { - // n++ - // } - // if len(taskIds) == 0 || isInArr(each.TaskId, taskIds) { - // n++ - // } - // //鍒ゆ柇鎶ヨ绛夌骇 - // if len(alarmLevels) == 0 { - // - // } - // n++ - // //鍒ゆ柇鏃堕棿 - // if len(timeArr) == 0 { - // - // } - // n++ - // if input == ""{ - // - // } - // n++ - // if n == 6 { - // resultList = append(resultList,cr) - // } - // } else { - // resultList = append(resultList,cr) - // } - //} +type PersonId struct { + Id string `json:"id"` +} - //logger.Debug("GetCompareDataTwice.data:",resultList) - //service.SortByScore(resultList) - from := (arg.Page-1)*arg.Size - to := from + arg.Size - var sCompResult protomsg.SdkCompareResult - total := len(*co.CompareData) - if total <= to { - sCompResult.CompareResult = (*co.CompareData)[from:total] - } else { - sCompResult.CompareResult = (*co.CompareData)[from:to] - } - resultList := FillDataToCompareResult(&sCompResult) - +func GetCompareDataTwice(co *service.CompareOnce,searchBody *models.EsSearch) map[string]interface{} { m := make(map[string]interface{},0) - m["total"] = total - m["compareNum"] = arg.CompareNum - m["totalList"] = resultList - //if from < len(resultList) { - // if to <= len(resultList) { - // m["totalList"] = resultList[from:to] - // } else { - // lte := len(resultList) - // m["totalList"] = resultList[from:lte] - // } + + from := (searchBody.Page-1)*searchBody.Size + to := from + searchBody.Size + + var hasCompEsPerson = false + if searchBody.DataBases !=nil { + for idx,tableId :=range searchBody.DataBases { + if tableId == "esData" { + hasCompEsPerson = true + searchBody.DataBases = append(searchBody.DataBases[:idx], searchBody.DataBases[idx+1:]...) + break + } + } + } + if hasCompEsPerson {//浜屾妫�绱S姣斿缁撴灉 + arg := protomsg.CompareArgs{ + CompareThreshold: searchBody.Threshold, + } + localConf, err := cache.GetServerInfo() + if err ==nil && localConf.AlarmIp != "" && localConf.ServerId != "" { + alarmLevelTypes := strings.Replace(strings.Trim(fmt.Sprint(getAlarmLevel(searchBody.AlarmLevel)), "[]"), " ", "\",\"", -1) + arg.Source = true // 鏍囪瘑鏉ユ簮鏄痺eb + arg.AlarmLevel = alarmLevelTypes + arg.Tasks = searchBody.Tasks + arg.TreeNodes = searchBody.TreeNodes + arg.Tabs = searchBody.Tabs + arg.SearchTime = searchBody.SearchTime + arg.InputValue = searchBody.InputValue + arg.Collection = searchBody.Collection + arg.AnalyServerId = localConf.ServerId + + captureIds := esApi.GetAllLocalVideopersonsId(arg, config.EsInfo.EsIndex.AiOcean.IndexName, localConf.AlarmIp, strconv.Itoa(int(localConf.AlarmPort)), alarmLevelTypes) + logger.Debug("searchPhoto first Result.len:",len(*co.CompareData),"twice len(captureIds):",len(captureIds)) + if captureIds !=nil { + var aResult protomsg.SdkCompareResult + aList := getTwiceSearchResult(co, &captureIds, searchBody) + aTotal := aList.Len() + if aTotal <= to { + aResult.CompareResult = (*aList)[from:aTotal] + } else { + aResult.CompareResult = (*aList)[from:to] + } + out := FillDataToCompareResult(&aResult) + m["total"] = aTotal + m["compareNum"] = searchBody.CompareNum + m["totalList"] = out + return m + } else { + m["total"] = 0 + m["compareNum"] = searchBody.CompareNum + m["totalList"] = []interface{}{} + return m + } + } + } else {//搴曞簱鏁版嵁鐨勪簩娆℃绱� + var dbpApi dbapi.DbPersonApi + personIds, _ := dbpApi.FindLikePersonIds(searchBody.DataBases, searchBody.InputValue) + logger.Debug("searchPhoto first Result.len:",len(*co.CompareData),"personIds:",personIds) + if personIds !=nil { + var pIds []PersonId + b, _ := json.Marshal(personIds) + json.Unmarshal(b, &pIds) + if len(pIds) >0 { + var personIdArr []string + for _,pid :=range pIds{ + personIdArr = append(personIdArr, pid.Id) + } + var aResult protomsg.SdkCompareResult + aList := getTwiceSearchResult(co, &personIdArr, searchBody) + aTotal := aList.Len() + if aTotal <= to { + aResult.CompareResult = (*aList)[from:aTotal] + } else { + aResult.CompareResult = (*aList)[from:to] + } + out := FillDataToCompareResult(&aResult) + m["total"] = aTotal + m["compareNum"] = searchBody.CompareNum + m["totalList"] = out + return m + } + + } else { + m["total"] = 0 + m["compareNum"] = searchBody.CompareNum + m["totalList"] = []interface{}{} + return m + } + } + + + //var sCompResult protomsg.SdkCompareResult + //total := len(*co.CompareData) + //if total <= to { + // sCompResult.CompareResult = (*co.CompareData)[from:total] //} else { - // m["totalList"] = []CompareResult{} + // sCompResult.CompareResult = (*co.CompareData)[from:to] //} + //resultList := FillDataToCompareResult(&sCompResult) + + + m["total"] = 0 + m["compareNum"] = searchBody.CompareNum + m["totalList"] = []interface{}{} + return m +} + +func getTwiceSearchResult(co *service.CompareOnce, scopeIds *[]string, searchBody *models.EsSearch) *service.CompareList{ + m := make(map[string]string) + for _,capId :=range *scopeIds { + m[capId] = capId + } + var totalData service.CompareList + for _,each :=range *co.CompareData { + if _,ok :=m[each.Id];ok && each.CompareScore >= searchBody.Threshold { + totalData = append(totalData, each) + } + } + + if totalData != nil && totalData.Len() > 0{ + sort.Sort(totalData) + } + + return &totalData } func isInArr(id string,arr []string) bool { @@ -538,7 +737,12 @@ util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") return } - var weedfsUri = "http://"+config.WeedFs.Ip+":"+strconv.Itoa(config.WeedFs.UploadPort)+"/submit" + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + return + } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit" //灏嗕笂浼犵殑鍥剧墖浜や汉鑴告娴嬪拰浜鸿劯鎻愬彇锛岃幏寰楃壒寰� fileBytes, _ := ioutil.ReadAll(file) @@ -572,7 +776,6 @@ func uploadFileReturnAddr(file multipart.File, filename string, tableId string) (string, map[string]interface{}, error) { defer file.Close() - field := "" // weedfs 涓婁紶 fileBytes, err := ioutil.ReadAll(file) if err !=nil { @@ -598,35 +801,33 @@ break } } - var weedfsUri = "http://"+config.WeedFs.Ip+":"+strconv.Itoa(config.WeedFs.UploadPort)+"/submit" + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + return "",nil,err2 + } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit" //鏍规嵁浜鸿劯鍧愭爣鎵e嚭浜鸿劯灏忓浘 t1 := time.Now() cutFaceImgData := util.SubImg(*pI, int(rcFace.Left), int(rcFace.Top), int(rcFace.Right), int(rcFace.Bottom)) logger.Debug("SubImg鐢ㄦ椂锛�", time.Since(t1)) t1 = time.Now() - fileInfo, e := esutil.PostFormData(weedfsUri, filename, "file", cutFaceImgData) + weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, filename, cutFaceImgData) logger.Debug("涓婁紶鍒皐eedfs鐢ㄦ椂:", time.Since(t1)) t1 = time.Now() if e != nil { - fmt.Println(e.Error()) + logger.Debug("WeedFSClient.UploadFile err:", e) return "", nil, e - } else { - field = fileInfo[picUrlField].(string) // 鏂囦欢璺緞 } - if strings.Contains(field,"/"){ - idx := strings.Index(field, "/") - field = field[idx+1:] - } + ext := path.Ext(filename) fileNameOnly := strings.TrimSuffix(filename, ext) dbperson := new(models.Dbtablepersons) - dbperson.PersonPicUrl = field // 鍥剧墖璺粡 + dbperson.PersonPicUrl = weedFilePath // 鍥剧墖璺粡 dbperson.TableId = tableId // dbperson.PersonName = fileNameOnly // 鍥剧墖鍚� dbperson.Enable = 1 //榛樿鏈夋晥 - // 婕旂ずbase64缂栫爜 - dbperson.FaceFeature = faceBase64 // 鐗瑰緛鍊糱ase64 鐮� result := addDbPerson(dbperson) @@ -637,9 +838,10 @@ /**涓婁紶鏂规硶**/ +// @Security ApiKeyAuth // @Summary 鎵归噺娣诲姞搴曞簱浜哄憳 // @Description 渚濇嵁鍥剧墖鎵归噺娣诲姞搴曞簱浜哄憳 -// @Accept mpfd +// @Accept multipart/form-data // @Produce json // @Tags dbperson 搴曞簱浜哄憳 // @Param files formData file[] true "澶氫釜搴曞簱浜哄憳鍥剧墖" @@ -659,8 +861,10 @@ } extNames := make([]string, 0) addResult := make(map[string]interface{}, 0) - successList := make([]string, 0) + successList := make([]string,0) failList := make([]string,0) + noFaceList := make([]string,0) + multiFaceList := make([]string,0) tAllStart := time.Now() var wg sync.WaitGroup var lock sync.Mutex @@ -670,8 +874,15 @@ defer wg.Done() tIStart := time.Now() filename := head.Filename + fileExt := path.Ext(filename) + fileExt = strings.ToLower(fileExt) + if fileExt !=".jpg" && fileExt != ".jpeg" && fileExt != ".png" { + lock.Lock() + failList = append(failList, filename) + lock.Unlock() + return + } file, err := head.Open() - fmt.Println(file, err, filename) if err != nil { lock.Lock() failList = append(failList, filename) @@ -681,7 +892,13 @@ field, _, err1 := uploadFileReturnAddr(file, filename, tableId) lock.Lock() if err1 != nil || field == "" { - failList = append(failList, filename) + if err1 !=nil && err1.Error() == "NotFeatureFindError" { + noFaceList = append(noFaceList, filename) + } else if err1 !=nil && err1.Error() == "TooManyFaces" { + multiFaceList = append(multiFaceList, filename) + } else { + failList = append(failList, filename) + } } else { successList = append(successList, filename) } @@ -693,6 +910,8 @@ logger.Debug("鍒�",len(fileHeaders),"寮犱汉鑴哥敤鏃讹細", time.Since(tAllStart)) addResult["successList"] = successList addResult["failList"] = failList + addResult["noFaceList"] = noFaceList + addResult["multiFaceList"] = multiFaceList addResult["fields"] = extNames if len(successList)>0 { @@ -710,9 +929,10 @@ IdCard string `json:"idCard"` } +// @Security ApiKeyAuth // @Summary 涓婁紶鍥剧墖 骞跺垏鍥� // @Description 涓婁紶鍥剧墖 骞跺垏鍥� -// @Accept mpfd +// @Accept multipart/form-data // @Produce json // @Tags dbperson 搴曞簱浜哄憳 // @Param file formData file true "搴曞簱浜哄憳鍥剧墖" @@ -741,7 +961,12 @@ util.ResponseFormat(c, code.UploadFileError, err2.Error()) return } - var weedfsUri = "http://"+config.WeedFs.Ip+":"+strconv.Itoa(config.WeedFs.UploadPort)+"/submit" + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + return + } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit" { uri := weedfsUri fileInfo, e := esutil.PostFormBufferData(uri, filename, "file", uploadData) -- Gitblit v1.8.0