liuxiaolong
2019-07-24 087af7f0bf2890887bd185a8e2e6879ee7c629d1
add faceExtract and searchByPhoto
2个文件已修改
85 ■■■■■ 已修改文件
controllers/fileController.go 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
router/router.go 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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) {
router/router.go
@@ -160,6 +160,8 @@
        vdbperson.PUT("/addDbPerson", dbPersonCont.AddDbPerson)
        vdbperson.POST("/fileUploadTest", fileController.UploadPersonTest)
        vdbperson.POST("/faceExtract",fileController.FaceExtract)
        vdbperson.POST("/searchByPhoto",fileController.SearchByPhoto)
    }
    // 系统设置 操作