package service import ( "basic.com/pubsub/protomsg.git" "basic.com/valib/godraw.git" "basic.com/valib/logger.git" "bytes" "github.com/gogo/protobuf/proto" "image" "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){ bt := bytes.NewBuffer(s.File) img, _, err := image.Decode(bt) if err != nil { return nil, err } bgr := godraw.Image2BGR(img) timeUnix := time.Now().Unix() formatTimeStr := time.Unix(timeUnix, 0).Format("2006-01-02 15:04:05") return &protomsg.Image{ Width: int32(img.Bounds().Dx()), Height: int32(img.Bounds().Dy()), Timestamp: formatTimeStr, Data: bgr, Id: s.Id, Cid: faceExtractWebCID, },nil }