sunty
2019-11-19 d9e01c51a525adf4f2393a95f87604e3b6e79ad2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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
}