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
|
}
|