liuxiaolong
2019-07-24 087af7f0bf2890887bd185a8e2e6879ee7c629d1
controllers/fileController.go
@@ -3,11 +3,13 @@
import (
   "basic.com/pubsub/protomsg.git"
   "basic.com/fileServer/WeedFSClient.git"
   "basic.com/valib/deliver.git"
   "bytes"
   "encoding/base64"
   "errors"
   "fmt"
   "github.com/gin-gonic/gin"
   "github.com/gogo/protobuf/proto"
   "github.com/satori/go.uuid"
   "image"
   "image/jpeg"
@@ -94,6 +96,87 @@
   }
}
type FaceExtract struct {
   Url string `json:"url"`
   FaceBytes []byte `json:"faceBytes"`
}
var faceExtractedMap = make(map[string]FaceExtract,0)
// @Description 人脸提取
// @Router /data/api-v/dbperson/faceExtract [POST]
func (controller FileController) FaceExtract(c *gin.Context) {
   file, _, err := c.Request.FormFile("file") //image这个是uplaodify参数定义中的   'fileObjName':'image'
   if err != nil {
      util.ResponseFormat(c, code.RequestParamError, "参数有误")
      return
   }
   var weedfsUri = "http://"+config.WeedFs.Ip+":"+strconv.Itoa(config.WeedFs.UploadPort)+"/submit"
   //将上传的图片交人脸检测和人脸提取,获得特征
   fileBytes, _ := ioutil.ReadAll(file)
   faceArr, err, pI := service.GetFaceFeaFromSdk(fileBytes, time.Second*60)
   if err ==nil && len(faceArr) >0 {
      urlArr := make([]string,0)
      for _,r := range faceArr {
         rcFace := r.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:r.Feats,
            }
            urlArr = append(urlArr, weedFilePath)
         }
      }
      if len(urlArr) == 0{
         util.ResponseFormat(c,code.ComError,"未提取到人脸")
      } else {
         util.ResponseFormat(c,code.Success,urlArr)
      }
   } else {
      util.ResponseFormat(c,code.ComError,"未提取到人脸")
   }
}
// @Description 以图搜图
// @Router /data/api-v/dbperson/searchByPhoto [POST]
func (controller FileController) SearchByPhoto(c *gin.Context) {
   photoUrl := c.Request.FormValue("url")
   if photoUrl == "" {
      util.ResponseFormat(c, code.RequestParamError, "参数有误")
      return
   }
   if face,ok := faceExtractedMap[photoUrl];!ok{
      util.ResponseFormat(c, code.RequestParamError, "参数有误")
      return
   } else {
      reqUrl := "tcp://192.168.1.66:40010"
      reqClient := deliver.NewClient(deliver.ReqRep, reqUrl)
      arg := protomsg.CompareArgs{
         FaceFeature:face.FaceBytes,
         CompareThreshold:0.2,
      }
      b, err := proto.Marshal(&arg)
      if err !=nil{
         util.ResponseFormat(c, code.ComError, "请求marshal失败")
         return
      }
      err = reqClient.Send(b)
      if err !=nil{
         util.ResponseFormat(c, code.ComError, "比对服务请求失败")
         return
      }
      msg, err := reqClient.Recv()
      if err !=nil{
         util.ResponseFormat(c, code.ComError, "比对服务响应失败")
         return
      }
      fmt.Println("compareReuslt:",msg)
   }
}
// @Description 人员照片上传并获取特征值
// @Router /data/api-v/dbperson/fileUploadTest [POST]
func (controller FileController) UploadPersonTest(c *gin.Context) {