liuxiaolong
2019-09-20 5d78b36e851a5862302f2e40c99a4477020c79bc
查找此人时先切图
3个文件已修改
131 ■■■■ 已修改文件
cache/cache.go 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/fileController.go 115 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
extend/util/util.go 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cache/cache.go
@@ -32,7 +32,6 @@
    peers, _ := client.Peers()
    for b := range peers{
        logger.Debug("peerMsg:",b)
        updateData(b)
    }
}
controllers/fileController.go
@@ -337,6 +337,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
@@ -346,55 +376,70 @@
// @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{
        util.ResponseFormat(c, code.RequestParamError, "参数有误")
        return
    }
    localConf, err2 := cache.GetServerInfo()
    if err2 !=nil || localConf.AlarmIp == "" || localConf.ServerId == "" {
        logger.Debug("localConfig is wrong!!!")
        util.ResponseFormat(c,code.ComError,"localConf wrong")
        return
    }
    var faceB []byte
    if searchBody.CaptureId != "" {//做查找此人,搜所有抓拍和底库
        localConf, err2 := cache.GetServerInfo()
        if err2 !=nil || localConf.AlarmIp == "" || localConf.ServerId == "" {
            logger.Debug("localConfig is wrong!!!")
            util.ResponseFormat(c,code.ComError,"localConf wrong")
    var uploadImage string
    var smImages []string
    //if searchBody.CaptureId != "" {//做查找此人,搜所有抓拍和底库
    //    searchBase64Fea, err := esApi.GetVideoPersonFaceFeatureById(searchBody.CaptureId, 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, "本条抓怕特征不是base64,请检查")
    //            return
    //        }
    //        faceB = decodeF
    //    }
    //} else {//做以图搜图
    //
    //}
    if searchBody.PicUrl == "" || len(searchBody.DataBases) == 0 {
        util.ResponseFormat(c, code.RequestParamError, "参数有误")
        return
    }
    if face,ok := faceExtractedMap[searchBody.PicUrl];!ok{
        httpPicUrl := ""
        idx := strings.LastIndex(searchBody.PicUrl, ":")
        if idx>-1 {
            httpPicUrl = "http://"+localConf.WebPicIp+searchBody.PicUrl[idx:]
        } else {
            util.ResponseFormat(c, code.RequestParamError, "请重新上传图片")
            return
        }
        searchBase64Fea, err := esApi.GetVideoPersonFaceFeatureById(searchBody.CaptureId, config.EsInfo.EsIndex.VideoPersons.IndexName, localConf.AlarmIp, strconv.Itoa(int(localConf.AlarmPort)))
        logger.Debug("httpPicUrl:",httpPicUrl)
        rb,err := util.ReadImgData(httpPicUrl)
        if err !=nil {
            util.ResponseFormat(c, code.ComError, "抓拍数据不存在,请检查")
            util.ResponseFormat(c, code.RequestParamError, "请重新上传图片")
            return
        }
        if searchBase64Fea !=""{
            decodeF, err := base64.StdEncoding.DecodeString(searchBase64Fea)
            if err !=nil {
                util.ResponseFormat(c, code.ComError, "本条抓怕特征不是base64,请检查")
                return
            }
            faceB = decodeF
        }
    } else {//做以图搜图
        if searchBody.PicUrl == "" || len(searchBody.DataBases) == 0 {
            util.ResponseFormat(c, code.RequestParamError, "参数有误")
            return
        }
        if face,ok := faceExtractedMap[searchBody.PicUrl];!ok{
        feaB, oriImg, smImgs, e := GetFeaFromOneFaceImg(rb)
        if e !=nil {
            util.ResponseFormat(c, code.RequestParamError, "请重新上传图片")
            return
        } else {
            faceB = face.FaceBytes
            uploadImage = oriImg
            smImages = smImgs
            faceB = feaB
        }
    }
    var sysSetApi dbapi.SysSetApi
    analyServerId := ""
    flag, sysconf := sysSetApi.GetServerInfo()
    if flag {
        analyServerId = sysconf.ServerId
    } else {
        util.ResponseFormat(c, code.ComError, "analyServerId为空,配置有误")
        return
        faceB = face.FaceBytes
    }
    if faceB == nil {
@@ -427,7 +472,7 @@
    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)
@@ -454,7 +499,9 @@
        CompareData: &totalData,
    })
    m := make(map[string]interface{},3)
    m := make(map[string]interface{},5)
    m["uploadImage"] = uploadImage
    m["smImage"] = smImages
    if totalData != nil && totalData.Len() > 0{
        sort.Sort(totalData)
        total := totalData.Len()
extend/util/util.go
@@ -10,7 +10,9 @@
    "github.com/pierrec/lz4"
    "gocv.io/x/gocv"
    "image"
    "io/ioutil"
    "net"
    "net/http"
    "os/exec"
    "strconv"
    "webserver/extend/code"
@@ -77,6 +79,19 @@
    //return data
}
func ReadImgData(url string) ([]byte,error) {
    resp,err := http.Get(url)
    if err !=nil {
        return nil,err
    }
    defer resp.Body.Close()
    pix,err := ioutil.ReadAll(resp.Body)
    if err !=nil {
        return nil,err
    }
    return pix,nil
}
// 按尺寸去切图
func SubImg(i protomsg.Image, x0, y0, x1, y1 int, ) []byte {
    img, _ := gocv.NewMatFromBytes(int(i.Height), int(i.Width), gocv.MatTypeCV8UC3, i.Data)