From b0500fee9c01e17c81b9293b244c8ed88dc9ca29 Mon Sep 17 00:00:00 2001 From: liuxiaolong <736321739@qq.com> Date: 星期五, 11 十月 2019 15:12:25 +0800 Subject: [PATCH] add swagger --- controllers/fileController.go | 345 ++++++++++++++++++++++++++++++++++----------------------- 1 files changed, 207 insertions(+), 138 deletions(-) diff --git a/controllers/fileController.go b/controllers/fileController.go index 4640286..7bfc13a 100644 --- a/controllers/fileController.go +++ b/controllers/fileController.go @@ -10,7 +10,9 @@ "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 +24,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" @@ -120,7 +123,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,13 +150,31 @@ } } //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) } else { util.ResponseFormat(c,code.ComError,"鏈彁鍙栧埌浜鸿劯") } +} + +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 { @@ -184,48 +211,45 @@ Enable int32 `json:"enable"` } -type CompareSortResult []CompareResult - -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 ScoreIndex struct { + CompareScore float32 + Index int } //濉厖鍚戝墠绔繑鍥炵殑鏁版嵁 -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) - personIds :=make([]string,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: v.CompareScore, + } captureIds = append(captureIds,v.Id) } else { - dbPersonM[v.Id] = v + dbPersonM[v.Id] = ScoreIndex{ + Index: idx, + CompareScore: 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) } - logger.Debug("comp dbpersons.len:", len(dbpersons)) - if dbpersons !=nil { + if len(dbpersons) >0 { + var dtApi dbapi.DbTableApi for _,p :=range dbpersons { var dbP = DbPersonVo { PersonId: p.Id, @@ -239,19 +263,25 @@ TableId: p.TableId, 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) + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.AlarmIp == "" || localConf.ServerId == "" { + logger.Debug("localConfig is wrong!!!") + return nil + } + logger.Debug("captureIds:",strings.Join(captureIds,",")) + videopersons, _ := esApi.Videopersonsinfosbyid(captureIds, config.EsInfo.EsIndex.VideoPersons.IndexName, localConf.AlarmIp, strconv.Itoa(int(localConf.AlarmPort))) logger.Debug("comp videoPersons.len:",len(videopersons)) for _,vp :=range videopersons { isAlarmInt, _ := strconv.Atoi(vp.IsAlarm) @@ -289,10 +319,9 @@ BaseInfo: bi, SdkName: "浜鸿劯", } - resultList = append(resultList,vpE) + resultList[captureM[vp.Id].Index] = vpE } } - sort.Sort(resultList) return resultList } @@ -309,6 +338,36 @@ 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") + } +} + // @Summary 浠ュ浘鎼滃浘 // @Description 浠ュ浘鎼滃浘 // @Accept json @@ -318,61 +377,71 @@ // @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 || searchBody.PicUrl == "" || len(searchBody.DataBases) == 0 { + if err !=nil{ util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") return } - var faceB []byte - if searchBody.CaptureId != "" {//鍋氭煡鎵炬浜� - searchPeople, err := esApi.Dbpersoninfosbyid([]string{searchBody.CaptureId}, config.EsInfo.EsIndex.VideoPersons.IndexName, config.EsInfo.Masterip, config.EsInfo.Httpport) - if err !=nil { - util.ResponseFormat(c, code.ComError, "鎶撴媿鏁版嵁涓嶅瓨鍦紝璇锋鏌�") - return - } - if searchPeople !=nil && len(searchPeople) == 1{ - decodeF, err := base64.StdEncoding.DecodeString(searchPeople[0].FaceFeature) - if err !=nil { - util.ResponseFormat(c, code.ComError, "鏈潯鎶撴�曠壒寰佷笉鏄痓ase64锛岃妫�鏌�") - return - } - faceB = decodeF - } - } - //if searchBody.CompareNum !="" { - // //浜屾鎼滅储锛屼笉闇�瑕佸啀姣斿浜� - // co := service.GetCompResultByNum(searchBody.CompareNum) - // if co != nil { - // //浜屾鎼滅储鍜屾帓搴� - // twiceM := GetCompareDataTwice(co,&searchBody) - // util.ResponseFormat(c,code.Success,twiceM) - // } else { - // m :=make(map[string]interface{},0) - // m["compareNum"] = searchBody.CompareNum - // m["total"] = 0 - // m["totalList"] = []CompareResult{} - // util.ResponseFormat(c,code.CompareResultGone,m) - // } - //} - var sysSetApi dbapi.SysSetApi - analyServerId := "" - flag, sysconf := sysSetApi.GetServerInfo() - if flag { - analyServerId = sysconf.ServerId - } else { - util.ResponseFormat(c, code.ComError, "analyServerId涓虹┖锛岄厤缃湁璇�") + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.AlarmIp == "" || localConf.ServerId == "" { + logger.Debug("localConfig is wrong!!!") + util.ResponseFormat(c,code.ComError,"localConf wrong") return } - if searchBody.CaptureId == ""{ + var faceB []byte + + 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 + } + } else { + searchBase64Fea, err := esApi.GetVideoPersonFaceFeatureById(searchBody.CompTargetId, config.EsInfo.EsIndex.VideoPersons.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, "浠ュ浘鎼滃浘PicUrl涓嶈兘涓虹┖") + return + } if face,ok := faceExtractedMap[searchBody.PicUrl];!ok{ - util.ResponseFormat(c, code.RequestParamError, "璇烽噸鏂颁笂浼犲浘鐗�") + util.ResponseFormat(c, code.RequestParamError, "浜鸿劯鐗瑰緛鏈娴嬶紝璇烽噸鏂颁笂浼犲浘鐗�") return } else { faceB = face.FaceBytes } } + if faceB == nil { util.ResponseFormat(c, code.RequestParamError, "璇烽噸鏂颁笂浼犲浘鐗�") return @@ -382,15 +451,18 @@ 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 } } arg.TableIds = searchBody.DataBases + } else { + arg.TableIds = []string{} } arg.Source = true // 鏍囪瘑鏉ユ簮鏄痺eb arg.AlarmLevel = searchBody.AlarmLevel @@ -400,40 +472,45 @@ 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 @@ -441,7 +518,7 @@ } else { m["total"] = 0 - m["compareNum"] = searchBody.CompareNum + m["compareNum"] = compareService.CompareNum m["totalList"] = []CompareResult{} } util.ResponseFormat(c,code.Success,m) @@ -537,7 +614,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) @@ -571,7 +653,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 { @@ -597,35 +678,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) @@ -633,27 +712,6 @@ return fileNameOnly, result, nil } - -//func getFaceFeaFromSdk(fileBytes []byte) ([]*protomsg.ResultFaceExtCom,error,*protomsg.Image){ -// s := service.NewFaceSdkService(fileBytes) -// i, err := s.ReadFromUploadImg() -// if err !=nil{ -// fmt.Println("readFromUploadImg err:",err) -// return nil,err,i -// } -// bc, err := service.ImgCompress(i) -// if err !=nil { -// fmt.Println("ImgCompress err:",err) -// return nil,err,i -// } -// s.PushImgMsg(bc) -// s.GetFaceFea() -// if s.Result == nil{ -// return nil,errors.New("no fea"),i -// } else { -// return s.Result,nil,i -// } -//} /**涓婁紶鏂规硶**/ @@ -690,8 +748,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) @@ -714,13 +779,12 @@ addResult["successList"] = successList addResult["failList"] = failList addResult["fields"] = extNames - //addResult["detail"] = details - //fields := fdfsclient.UploadFileByBuffer100(bytess, extNames) // fastdfs 涓婁紶 - if len(successList)>0 { + + //if len(successList)>0 { util.ResponseFormat(c, code.DbPersonUploadSuccess, addResult) - } else { - util.ResponseFormat(c, code.ServiceInsideError, err.Error()) - } + //} else { + // util.ResponseFormat(c, code.DbPersonUploadFail, addResult) + //} } type EsPersonSave struct { @@ -762,7 +826,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