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