liuxiaolong
2019-07-06 29dfebcebf17690e4f5c72192f2bb4547ef51eea
test cut face
2个文件已修改
164 ■■■■■ 已修改文件
controllers/fileController.go 118 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
extend/util/util.go 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/fileController.go
@@ -103,14 +103,31 @@
    //将上传的图片交人脸检测和人脸提取,获得特征
    fileBytes, _ := ioutil.ReadAll(file)
    faceExtArr, err := getFaceFeaFromSdk(fileBytes)
    faceExtArr, err, pI := getFaceFeaFromSdk(fileBytes)
    if err ==nil && len(faceExtArr) >0 {
        var faceBase64= ""
        var field = ""
        var rcFace *protomsg.Rect
        for _,r := range faceExtArr {
            rcFace = r.Pos.Pos.RcFace
            faceBase64 = base64.StdEncoding.EncodeToString(r.Feats)//获取提取到的第一张人脸特征
            break
        }
        util.ResponseFormat(c,code.Success,faceBase64)
        //根据人脸坐标扣出人脸小图
        cutFaceImgData := util.SubImg(*pI, int(rcFace.Left), int(rcFace.Top), int(rcFace.Right), int(rcFace.Bottom))
        fileInfo, e := esutil.PostFormData(weedfsUri, "测试人脸切图", "file", cutFaceImgData)
        if e != nil {
            fmt.Println(e.Error())
        } else {
            field = fileInfo[picUrlField].(string) // 文件路径
        }
        if strings.Contains(field,"/"){
            idx := strings.Index(field, "/")
            field = field[idx+1:]
        }
        fmt.Println("field:",field)
        util.ResponseFormat(c,code.Success,field + ";" + faceBase64)
    } else {
        util.ResponseFormat(c,code.ComError,"未提取到人脸")
    }
@@ -123,7 +140,6 @@
}*/
func uploadFileReturnAddr(file multipart.File, filename string, tableId string) (string, map[string]interface{}, error) {
    defer file.Close()
    field := ""
    // weedfs 上传
@@ -131,83 +147,69 @@
    if err !=nil {
        return "",nil,err
    }
    fileInfo, e := esutil.PostFormData(weedfsUri, filename, "file", fileBytes)
    //将上传的图片交人脸检测和人脸提取,获得特征
    var faceBase64=""
    faceExtArr, err,pI := getFaceFeaFromSdk(fileBytes)
    if faceExtArr ==nil {
        return "",nil,errors.New("NotFeatureFindError")
    }
    var rcFace *protomsg.Rect
    if err ==nil && len(faceExtArr) >0 {
        for _,r := range faceExtArr {
            //拿到人脸的坐标
            rcFace = r.Pos.Pos.RcFace
            faceBase64 = base64.StdEncoding.EncodeToString(r.Feats)//获取提取到的第一张人脸特征
            break
        }
    }
    //根据人脸坐标扣出人脸小图
    cutFaceImgData := util.SubImg(*pI, int(rcFace.Left), int(rcFace.Top), int(rcFace.Right), int(rcFace.Bottom))
    fileInfo, e := esutil.PostFormData(weedfsUri, filename, "file", cutFaceImgData)
    if e != nil {
        fmt.Println(e.Error())
        return "", nil, e
    } else {
        field = fileInfo[picUrlField].(string) // 文件路径
    }
    if field != "" {
        // 返回特征值  fileInfo["point"] = v.RcFace  fileInfo["feature"] = feat
        /*features := gorun.GetSimpleFaceDetect(picIp+field)  // 特征值     // linux
            if len(features) == 0 {                                               // linux
                return field,nil,errors.New("NotFeatureFindError")  // linux
            }else if len(features) > 1 {                                            // linux
                return field,nil,errors.New("TooManyFeatureFindError")  // linux
            }                                                                  // linux
            feat := features[0]["feature"].([]byte)   // linux
        if len(feat) != 2560 {                                // linux
            return field,nil,errors.New("NotFeatureFindError")
        }    */                     // linux
        if strings.Contains(field,"/"){
            idx := strings.Index(field, "/")
            field = field[idx+1:]
        }
        fmt.Println("field:",field)
        //imgB, _ := ioutil.ReadAll(file)
        //fmt.Println("img.length:",len(imgB))
        //将上传的图片交人脸检测和人脸提取,获得特征
        var faceBase64=""
        faceExtArr, err := getFaceFeaFromSdk(fileBytes)
        if faceExtArr ==nil {
            return "",nil,errors.New("NotFeatureFindError")
        }
        if err ==nil && len(faceExtArr) >0 {
            for _,r := range faceExtArr {
                faceBase64 = base64.StdEncoding.EncodeToString(r.Feats)//获取提取到的第一张人脸特征
                break
            }
        }
        dbperson := new(models.Dbtablepersons)
        dbperson.PersonPicUrl = field //  图片路经
        dbperson.TableId = tableId           //
        dbperson.PersonName = filename       // 图片名
        // 演示base64编码
        dbperson.FaceFeature = faceBase64 // 特征值base64 码
        result := addDbPerson(dbperson)
        return field, result, nil
    } else {
        return field, nil, nil
    if strings.Contains(field,"/"){
        idx := strings.Index(field, "/")
        field = field[idx+1:]
    }
    fmt.Println("field:",field)
    dbperson := new(models.Dbtablepersons)
    dbperson.PersonPicUrl = field //  图片路经
    dbperson.TableId = tableId           //
    dbperson.PersonName = filename       // 图片名
    // 演示base64编码
    dbperson.FaceFeature = faceBase64 // 特征值base64 码
    result := addDbPerson(dbperson)
    return field, result, nil
}
func getFaceFeaFromSdk(fileBytes []byte) ([]*protomsg.ResultFaceExtCom,error){
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
        return nil,err,i
    }
    bc, err := service.ImgCompress(i)
    if err !=nil {
        fmt.Println("ImgCompress err:",err)
        return nil,err
        return nil,err,i
    }
    s.PushImgMsg(bc)
    s.GetFaceFea()
    if s.Result == nil{
        return nil,errors.New("no fea")
        return nil,errors.New("no fea"),i
    } else {
        return s.Result,nil
        return s.Result,nil,i
    }
}
extend/util/util.go
@@ -1,9 +1,12 @@
package util
import (
    "basic.com/pubsub/protomsg.git"
    "encoding/json"
    "github.com/gin-gonic/gin"
    "github.com/golang/glog"
    "gocv.io/x/gocv"
    "image"
    "webserver/extend/code"
    "crypto/rand"
@@ -66,4 +69,47 @@
    //    data[t.Field(i).Name] = v.Field(i).Interface()
    //}
    //return data
}
// 按尺寸去切图
func SubImg(i protomsg.Image, x0, y0, x1, y1 int, ) []byte {
    img, _ := gocv.NewMatFromBytes(int(i.Height), int(i.Width), gocv.MatTypeCV8UC3, i.Data)
    rect := image.Rect(EnlargeSize(x0, y0, x1, y1, i))
    region := img.Region(rect)
    bytes, _ := gocv.IMEncode(".jpg", region)
    return bytes
}
// 长宽变为一比一,每边各扩百分之20
func EnlargeSize(x0, y0, x1, y1 int, i protomsg.Image) (x0_new, y0_new, x1_new, y1_new int) {
    // 先把长宽变为一比一
    chazhi := (y1 - y0) - (x1 - x0)
    x0 = x0 - chazhi/2
    if x0 < 0 {
        x0 = 0
    }
    x1 = x1 + chazhi/2
    if x1 > int(i.Width) {
        x1 = int(i.Width)
    }
    // 再把每边各扩大百分之20
    enlarge := float32(0.2)
    x0_new = int((1+enlarge)*float32(x0) - enlarge*float32(x1))
    if x0_new < 0 {
        x0_new = 0
    }
    x1_new = int((1+enlarge)*float32(x1) - enlarge*float32(x0))
    if x1_new > int(i.Width) {
        x1_new = int(i.Width)
    }
    y0_new = int((1+enlarge)*float32(y0) - enlarge*float32(y1))
    if y0_new < 0 {
        y0_new = 0
    }
    y1_new = int((1+enlarge)*float32(y1) - enlarge*float32(y0))
    if y1_new > int(i.Height) {
        y1_new = int(i.Height)
    }
    return
}