| | |
| | | import ( |
| | | "basic.com/dbapi.git" |
| | | "basic.com/fileServer/WeedFSClient.git" |
| | | esApi "basic.com/pubsub/esutil.git" |
| | | "basic.com/pubsub/protomsg.git" |
| | | "basic.com/valib/godraw.git" |
| | | "basic.com/valib/logger.git" |
| | | "bytes" |
| | | "encoding/base64" |
| | | "encoding/json" |
| | | "errors" |
| | | "fmt" |
| | | "github.com/gin-gonic/gin" |
| | | "github.com/satori/go.uuid" |
| | | "gocv.io/x/gocv" |
| | | "image" |
| | | "image/color" |
| | | "image/jpeg" |
| | | "io/ioutil" |
| | | "log" |
| | | "mime/multipart" |
| | | "net/http" |
| | | "path" |
| | | "sort" |
| | | "strconv" |
| | |
| | | "webserver/extend/code" |
| | | "webserver/extend/config" |
| | | "webserver/extend/esutil" |
| | | "basic.com/valib/logger.git" |
| | | "webserver/extend/util" |
| | | "webserver/models" |
| | | "webserver/service" |
| | | esApi "basic.com/pubsub/esutil.git" |
| | | ) |
| | | |
| | | type FileController struct { |
| | |
| | | //var weedfsUri = "http://192.168.1.182:9500/submit" |
| | | |
| | | // @Security ApiKeyAuth |
| | | // @Summary 依据图片添加底库人员 |
| | | // @Description 依据图片添加底库返回数据人员 |
| | | // @Summary 图片上传 |
| | | // @Description 图片上传 |
| | | // @Accept multipart/form-data |
| | | // @Produce json |
| | | // @Tags dbperson 底库人员 |
| | | // @Param file formData file true "底库人员图片" |
| | | // @Param tableId formData string false "底库id,有id 则加入底库,无则只上传图片" |
| | | // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" |
| | | // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" |
| | | // @Tags 图片上传 |
| | | // @Param file formData file true "图片" |
| | | // @Param picType formData string true "图片类型,0:车辆照片,1:人脸照片" |
| | | // @Success 200 {string} json "{"code":200, msg:"", success:true}" |
| | | // @Failure 500 {string} json "{"code":500, msg:"", success:false}" |
| | | // @Router /data/api-v/dbperson/fileupload [POST] |
| | | func (fc FileController) Fileupload(c *gin.Context) { |
| | | //得到上传的文件 |
| | | file, header, err := c.Request.FormFile("file") //image这个是uplaodify参数定义中的 'fileObjName':'image' |
| | | tableId := c.Request.FormValue("tableId") |
| | | if err != nil { |
| | | c.String(http.StatusBadRequest, "Bad request") |
| | | picType := c.Request.FormValue("picType") //图片类型 |
| | | if err != nil || (picType != "0" && picType != "1") { |
| | | util.ResponseFormat(c, code.RequestParamError, "参数有误") |
| | | return |
| | | } |
| | | //文件的名称 |
| | | filename := header.Filename |
| | | fmt.Println(file, err, filename) |
| | | if err != nil { |
| | | log.Fatal(err) |
| | | filename = uuid.NewV4().String() |
| | | } |
| | | // fastdfs |
| | | { |
| | | //fileSuffix := path.Ext(filename)[1:] //获取文件后缀 |
| | | //fmt.Println("文件后缀 =", fileSuffix) |
| | | //data, _ := ioutil.ReadAll(file) |
| | | // fastdfs 上传 暂废弃 |
| | | //field := fdfsclient.UploadFileByBuffer(data, fileSuffix) |
| | | } |
| | | fileNameOnly, result, err := uploadFileReturnAddr(file, filename, tableId) |
| | | if err != nil { |
| | | if err.Error() == "NotFeatureFindError" { |
| | | util.ResponseFormat(c, code.NotFeatureFindError, filename) |
| | | } else { |
| | | util.ResponseFormat(c, code.ServiceInsideError, err.Error()) |
| | | var result = make(map[string]string) |
| | | if picType == "1" { |
| | | _, _, err, faceFeature, faceUrlPath := uploadFileReturnAddr(file, filename, "", false) |
| | | if err != nil { |
| | | if err.Error() == "NotFeatureFindError" { |
| | | util.ResponseFormat(c, code.NotFeatureFindError, filename) |
| | | } else { |
| | | util.ResponseFormat(c, code.ServiceInsideError, err.Error()) |
| | | } |
| | | return |
| | | } |
| | | return |
| | | } |
| | | if tableId != "" { // 上传 |
| | | if result["success"].(bool) { |
| | | util.ResponseFormat(c, code.Success, result["data"]) |
| | | } else { |
| | | util.ResponseFormat(c, code.ServiceInsideError, result["data"]) |
| | | } |
| | | result["picUrl"] = faceUrlPath |
| | | result["faceFeature"] = faceFeature |
| | | } else { |
| | | util.ResponseFormat(c, code.Success, fileNameOnly) |
| | | localConf, err2 := cache.GetServerInfo() |
| | | if err2 !=nil || localConf.WebPicIp == "" { |
| | | logger.Debug("localConfig is wrong!!!") |
| | | util.ResponseFormat(c,code.ComError,"") |
| | | return |
| | | } |
| | | defer file.Close() |
| | | // weedfs 上传 |
| | | fileBytes, err := ioutil.ReadAll(file) |
| | | if err !=nil { |
| | | util.ResponseFormat(c,code.ComError,"") |
| | | return |
| | | } |
| | | var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent" |
| | | weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, filename, fileBytes) |
| | | if e != nil { |
| | | logger.Debug("WeedFSClient.UploadFile err:", e) |
| | | util.ResponseFormat(c,code.ComError,"UploadFile err") |
| | | return |
| | | } |
| | | result["picUrl"] = weedFilePath |
| | | } |
| | | |
| | | util.ResponseFormat(c, code.Success, result) |
| | | } |
| | | |
| | | |
| | |
| | | logger.Debug("localConfig is wrong!!!") |
| | | return |
| | | } |
| | | var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit" |
| | | var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent" |
| | | logger.Debug("weedfsUri:",weedfsUri) |
| | | resultMap :=make(map[string]interface{},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)) |
| | | cutFaceImgData,cutErr := util.SubCutImg(pI, rcFace, 20) |
| | | if cutErr != nil { |
| | | logger.Debug("util.SubCutImg err:", cutErr) |
| | | continue |
| | | } |
| | | weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", cutFaceImgData) |
| | | if e == nil{ |
| | | faceExtractedMap[weedFilePath] = FaceExtract{ |
| | |
| | | } |
| | | |
| | | func drawPolygonOnImg(i *protomsg.Image,faceArr *[]*protomsg.ResultFaceDetect) (*[]byte,error) { |
| | | rook, _ := gocv.NewMatFromBytes(int(i.Height), int(i.Width), gocv.MatTypeCV8UC3, i.Data) |
| | | defer rook.Close() |
| | | //yellow := color.RGBA{255, 255, 0, 0} |
| | | img,err := godraw.ToImage(i.Data, int(i.Width), int(i.Height)) |
| | | if err != nil { |
| | | return nil,err |
| | | } |
| | | red := color.RGBA{255, 0, 0, 0} |
| | | for _,faceResult := range *faceArr { |
| | | left := int(faceResult.Pos.RcFace.Left) |
| | | top := int(faceResult.Pos.RcFace.Top) |
| | | right := int(faceResult.Pos.RcFace.Right) |
| | | bottom := int(faceResult.Pos.RcFace.Bottom) |
| | | gocv.Rectangle(&rook, image.Rect(left,top,right,bottom), red, 1) |
| | | util.DrawRect(img.(*image.RGBA),int(faceResult.Pos.RcFace.Left),int(faceResult.Pos.RcFace.Top),int(faceResult.Pos.RcFace.Right), |
| | | int(faceResult.Pos.RcFace.Bottom), red) |
| | | } |
| | | fData,err := gocv.IMEncode(".jpg", rook) |
| | | return &fData,err |
| | | |
| | | quantity := 100 |
| | | jpgData, err := godraw.ImageToJpeg(img, &quantity) |
| | | return &jpgData,err |
| | | } |
| | | |
| | | type CompareResult struct { |
| | |
| | | logger.Debug("localConfig is wrong!!!") |
| | | return nil,"",nil,errors.New("localConf err") |
| | | } |
| | | var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit" |
| | | var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent" |
| | | 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)) |
| | | cutFaceImgData,_ := util.SubCutImg(pI, rcFace, 20) |
| | | weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", cutFaceImgData) |
| | | if e == nil{ |
| | | faceExtractedMap[weedFilePath] = FaceExtract{ |
| | |
| | | return |
| | | } |
| | | faceB = decodeF |
| | | } else { |
| | | util.ResponseFormat(c, code.ComError, "本条人脸抓拍特征为空,请检查") |
| | | return |
| | | } |
| | | } |
| | | |
| | |
| | | logger.Debug("localConfig is wrong!!!") |
| | | return |
| | | } |
| | | var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit" |
| | | var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent" |
| | | |
| | | //将上传的图片交人脸检测和人脸提取,获得特征 |
| | | fileBytes, _ := ioutil.ReadAll(file) |
| | |
| | | break |
| | | } |
| | | //根据人脸坐标扣出人脸小图 |
| | | cutFaceImgData := util.SubImg(*pI, int(rcFace.Left), int(rcFace.Top), int(rcFace.Right), int(rcFace.Bottom)) |
| | | cutFaceImgData,_ := util.SubCutImg(pI, rcFace, 20) |
| | | weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, "testCutFace", cutFaceImgData) |
| | | if e !=nil{ |
| | | util.ResponseFormat(c,code.ComError,"文件上传失败") |
| | |
| | | log.Fatalln(err) |
| | | }*/ |
| | | |
| | | func uploadFileReturnAddr(file multipart.File, filename string, tableId string) (string, map[string]interface{}, error) { |
| | | func uploadFileReturnAddr(file multipart.File, filename string, tableId string, add2Db bool) (string, map[string]interface{}, error, string, string) { |
| | | defer file.Close() |
| | | // weedfs 上传 |
| | | fileBytes, err := ioutil.ReadAll(file) |
| | | if err !=nil { |
| | | return "",nil,err |
| | | return "",nil,err,"","" |
| | | } |
| | | |
| | | //将上传的图片交人脸检测和人脸提取,获得特征 |
| | | var faceBase64="" |
| | | faceArr, err, pI := service.GetFaceFeaFromSdk(fileBytes, time.Second*5) |
| | | if faceArr ==nil { |
| | | return "",nil,errors.New("NotFeatureFindError") |
| | | return "",nil,errors.New("NotFeatureFindError"),"","" |
| | | } |
| | | var rcFace *protomsg.Rect |
| | | if err ==nil && len(faceArr) >0 { |
| | | if len(faceArr) >1 { |
| | | return "",nil, errors.New("TooManyFaces") |
| | | return "",nil, errors.New("TooManyFaces"),"","" |
| | | } |
| | | for _,r := range faceArr { |
| | | //拿到人脸的坐标 |
| | |
| | | localConf, err2 := cache.GetServerInfo() |
| | | if err2 !=nil || localConf.WebPicIp == "" { |
| | | logger.Debug("localConfig is wrong!!!") |
| | | return "",nil,err2 |
| | | return "",nil,err2,"","" |
| | | } |
| | | var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit" |
| | | var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent" |
| | | //根据人脸坐标扣出人脸小图 |
| | | t1 := time.Now() |
| | | cutFaceImgData := util.SubImg(*pI, int(rcFace.Left), int(rcFace.Top), int(rcFace.Right), int(rcFace.Bottom)) |
| | | cutFaceImgData,cutErr := util.SubCutImg(pI, rcFace, 20) |
| | | if cutErr != nil { |
| | | logger.Debug("util.SubCutImg err:", cutErr) |
| | | return "", nil, cutErr,"","" |
| | | } |
| | | logger.Debug("SubImg用时:", time.Since(t1)) |
| | | t1 = time.Now() |
| | | weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, filename, cutFaceImgData) |
| | |
| | | t1 = time.Now() |
| | | if e != nil { |
| | | logger.Debug("WeedFSClient.UploadFile err:", e) |
| | | return "", nil, e |
| | | return "", nil, e,"","" |
| | | } |
| | | |
| | | ext := path.Ext(filename) |
| | | fileNameOnly := strings.TrimSuffix(filename, ext) |
| | | |
| | | dbperson := new(models.Dbtablepersons) |
| | | dbperson.PersonPicUrl = weedFilePath // 图片路经 |
| | | dbperson.TableId = tableId // |
| | | dbperson.PersonName = fileNameOnly // 图片名 |
| | | dbperson.Enable = 1 //默认有效 |
| | | dbperson.FaceFeature = faceBase64 // 特征值base64 码 |
| | | var result map[string]interface{} |
| | | if add2Db { |
| | | dbperson := new(models.Dbtablepersons) |
| | | dbperson.PersonPicUrl = weedFilePath // 图片路经 |
| | | dbperson.TableId = tableId // |
| | | dbperson.PersonName = fileNameOnly // 图片名 |
| | | dbperson.Enable = 1 //默认有效 |
| | | dbperson.FaceFeature = faceBase64 // 特征值base64 码 |
| | | |
| | | result := addDbPerson(dbperson) |
| | | logger.Debug("addDbPerson用时:", time.Since(t1)) |
| | | return fileNameOnly, result, nil |
| | | result = addDbPerson(dbperson) |
| | | } |
| | | |
| | | logger.Debug("addDbPerson用时:", time.Since(t1), "result:", result) |
| | | return fileNameOnly, result, nil,faceBase64, weedFilePath |
| | | |
| | | } |
| | | |
| | |
| | | lock.Unlock() |
| | | return |
| | | } |
| | | field, _, err1 := uploadFileReturnAddr(file, filename, tableId) |
| | | field, _, err1,_,_ := uploadFileReturnAddr(file, filename, tableId, true) |
| | | lock.Lock() |
| | | if err1 != nil || field == "" { |
| | | if err1 !=nil && err1.Error() == "NotFeatureFindError" { |
| | |
| | | logger.Debug("localConfig is wrong!!!") |
| | | return |
| | | } |
| | | var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit" |
| | | var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent" |
| | | { |
| | | uri := weedfsUri |
| | | fileInfo, e := esutil.PostFormBufferData(uri, filename, "file", uploadData) |