package service import ( "basic.com/pubsub/protomsg.git" "basic.com/valib/logger.git" "github.com/gogo/protobuf/proto" "github.com/pkg/errors" "gocv.io/x/gocv" "time" ) type FaceSdkService struct { File []byte Id int64 Result []*protomsg.ResultFaceDetect DeadTime time.Duration } const ( faceExtractWebCID = "virtual-face-extract-web-camera-id" ) func GetFaceFeaFromSdk(fileBytes []byte,deadTime time.Duration) ([]*protomsg.ResultFaceDetect,error,*protomsg.Image){ t1 := time.Now() s := newFaceSdkService(fileBytes, deadTime) i, err := s.readFromUploadImg() logger.Debug("ReadFromUploadImg用时:", time.Since(t1)) if err !=nil{ logger.Debug("readFromUploadImg err:",err) return nil,err,i } imgBytes, err := proto.Marshal(i) if err !=nil { logger.Debug("i marshal err:",err) return nil,err,i } detectResults, err := DoFDetectWithRpc(&protomsg.FaceDetectRequest{ReqParam: imgBytes}, deadTime) logger.Debug("提取face共用时:", time.Since(t1)) if err !=nil { logger.Debug("DoFDetectWithRpc err:",err) return nil,err,i } else { return detectResults,nil,i } } func newFaceSdkService(fileBytes []byte, deadTime time.Duration) *FaceSdkService{ return &FaceSdkService{ File:fileBytes, Id:time.Now().UnixNano(), DeadTime:deadTime, } } func (s *FaceSdkService) readFromUploadImg() (*protomsg.Image,error){ picMat, err := gocv.IMDecode(s.File, gocv.IMReadColor) if err !=nil { logger.Debug("gocv.IMDecode err:",err) return nil,err } logger.Debug("picMat.Data.len:", len(picMat.ToBytes())) //图片缩小分辨率 //newMat := gocv.NewMat() //size := 1024 //if picMat.Rows() > size || picMat.Cols() > size { // fx := float64(size)/float64(picMat.Rows()) // fy := float64(size)/float64(picMat.Cols()) // ff := fx // if fx > fy{ // ff = fy // } // gocv.Resize(picMat,&newMat, image.Pt(0,0), ff, ff, gocv.InterpolationDefault) // picMat = newMat //} defer picMat.Close() if picMat.Empty() { logger.Debug("file not exist") return nil,errors.New("picMat is empty") } height := int32(picMat.Rows()) width := int32(picMat.Cols()) data := picMat.ToBytes() timeUnix := time.Now().Unix() formatTimeStr := time.Unix(timeUnix, 0).Format("2006-01-02 15:04:05") return &protomsg.Image{ Width: width, Height: height, Timestamp: formatTimeStr, Data: data, Id: s.Id, Cid: faceExtractWebCID, },nil }