| | |
| | | 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" |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | 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) { |