liuxiaolong
2019-06-28 b4682ed34ef9e89649ded8723ffb4aaac63139e1
service/FaceSdkService.go
@@ -7,10 +7,18 @@
   "fmt"
   "github.com/gogo/protobuf/proto"
   "github.com/pierrec/lz4"
   "github.com/pkg/errors"
   "github.com/satori/go.uuid"
   "gocv.io/x/gocv"
   "mime/multipart"
   "sync"
   "time"
)
type FaceSdkService struct {
   File multipart.File
   Id string
}
const (
   Ipc_Push_Ext = "_2.ipc"
@@ -21,6 +29,14 @@
   Url_Service_PUSH = Ipc_Url_Pre + Virtual_FaceSdkId + Ipc_Push_Ext
   Url_Service_PULL = Ipc_Url_Pre + Virtual_FaceSdkId + Ipc_Pull_Ext
)
func NewFaceSdkService(file multipart.File) FaceSdkService{
   return FaceSdkService{
      File:file,
      Id:uuid.NewV4().String(),
   }
}
var imgPushChan chan []byte
var client_push deliver.Deliver
var client_pull deliver.Deliver
@@ -28,33 +44,101 @@
func TestPushImgMsg() {
   InitService()
   i := readImgFile()
   i := readTestImgFile()
   fmt.Printf("width:%d,height:%d,data.length:%d,timestamp:%s,id:%d\n",i.Width,i.Height,len(i.Data),i.Timestamp,i.Id)
   if b, err := proto.Marshal(&i);err !=nil{
   bc, err := ImgCompress(&i)
   if err !=nil {
      fmt.Println("image is not compressible")
   } else {
      var s FaceSdkService
      s.PushImgMsg(bc)
   }
}
func (s *FaceSdkService) ReadFromUploadImg() (*protomsg.Image,error){
   defer s.File.Close()
   imgB := make([]byte,0)
   if _, err := s.File.Read(imgB);err !=nil{
      return nil,err
   }
   picMat, err := gocv.IMDecode(imgB, gocv.IMReadColor)
   if err !=nil {
      return nil,err
   }
   defer picMat.Close()
   if picMat.Empty() {
      fmt.Println("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: timeUnix,
      Cid:s.Id,
   },nil
}
func ImgCompress(i *protomsg.Image) ([]byte,error){
   if b, err := proto.Marshal(i);err !=nil{
      fmt.Println("protoImage marshal err")
      return
      return nil,err
   } else {
      bc := make([]byte,len(b))
      ht := make([]int, 64<<10)
      n,err := lz4.CompressBlock(b, bc, ht)
      if err !=nil {
         fmt.Println(err)
         return nil,err
      }
      if n >= len(b){
         fmt.Println("image is not compressible")
         return nil,errors.New("compressed len is 0")
      }
      bc = bc[:n]
      for {
         PushImgMsg(bc)
         fmt.Println("pushed img")
         time.Sleep(5*time.Second)
      }
      return bc,nil
   }
}
func readImgFile() protomsg.Image{
func (s *FaceSdkService) GetFaceFea() (feas []*protomsg.ResultFaceExtCom,err error){
   var wg sync.WaitGroup
   wg.Add(1)
   ch := make(chan []*protomsg.ResultFaceExtCom,0)
   go func() {
      for {
         select {
         case <-time.Tick(time.Second*10):
            ch <- nil
            wg.Done()
            return
         default:
            if feas,ok := resultMap[s.Id];ok {
               fmt.Println("faceFea got!!!")
               ch <- feas
               return
            }
         }
      }
   }()
   wg.Wait()
   msg := <- ch
   if msg != nil {
      return msg,nil
   } else {
      return msg,errors.New("no fea")
   }
}
func readTestImgFile() protomsg.Image{
   var i protomsg.Image
   timeUnix := time.Now().Unix()
   formatTimeStr := time.Unix(timeUnix, 0).Format("2006-01-02 15:04:05")
@@ -87,17 +171,17 @@
   return i
}
func PushImgMsg(is []byte){
func  (s *FaceSdkService) PushImgMsg(is []byte){
   imgPushChan <- is
}
var resultMap map[string]protomsg.SdkMessage
var resultMap map[string][]*protomsg.ResultFaceExtCom
func InitService(){
   fmt.Println("service init!")
   imgPushChan = make(chan []byte)
   resultMap = make(map[string]protomsg.SdkMessage,0)
   resultMap = make(map[string][]*protomsg.ResultFaceExtCom,0)
   client_push = deliver.NewClient(deliver.PushPull, Url_Service_PUSH)
   client_pull = deliver.NewClient(deliver.PushPull, Url_Service_PULL)
   defer func() {
@@ -138,40 +222,40 @@
         if rMsg.Tasklab !=nil && rMsg.Tasklab.Taskid == Virtual_FaceTaskId {
            sdkInfos := rMsg.Tasklab.Sdkinfos
            fmt.Println("Len(sdkInfos)=",len(sdkInfos))
               for _,swt :=range sdkInfos{
                  fmt.Println("sdkName:",swt.SdkName)
                  if swt.Sdktype =="FaceDetect"{
                     fmt.Println("人脸检测结果")
                     var pfp protomsg.ParamFacePos
                     err := proto.Unmarshal(swt.Sdkdata, &pfp)
                     if err !=nil {
                        fmt.Println("faceDetect result unmarshal err:",err)
                     } else {
                        for _,face :=range pfp.Faces{
                           fmt.Println("FacePos:",face.Pos)
                           fmt.Println("ThftResult:",face.Result)
                        }
            for _,swt :=range sdkInfos{
               if swt.Sdktype =="FaceDetect"{
                  fmt.Println("人脸检测结果")
                  var pfp protomsg.ParamFacePos
                  err := proto.Unmarshal(swt.Sdkdata, &pfp)
                  if err !=nil {
                     fmt.Println("faceDetect result unmarshal err:",err)
                  } else {
                     for _,face :=range pfp.Faces{
                        fmt.Println("FacePos:",face.Pos)
                        fmt.Println("ThftResult:",face.Result)
                     }
                  }
                  if swt.Sdktype == "FaceExtract"{
                     fmt.Println("sdkData.len:",len(swt.Sdkdata))
                     var pff protomsg.ParamFaceFeature
                     if err := proto.Unmarshal(swt.Sdkdata, &pff);err !=nil{
                        //fmt.Println("ParamFaceFeature unmarshal err:",err)
                     } else {
                        fmt.Println("目标数:",len(pff.ExtComp))
               }
               if swt.Sdktype == "FaceExtract"{
                  var pff protomsg.ParamFaceFeature
                  if err := proto.Unmarshal(swt.Sdkdata, &pff);err !=nil{
                     //fmt.Println("ParamFaceFeature unmarshal err:",err)
                  } else {
                     fmt.Println("目标数:",len(pff.ExtComp))
                     if len(pff.ExtComp) >0 {
                        resultMap[rMsg.Cid] = pff.ExtComp
                        for _,fea :=range pff.ExtComp{
                           base64Fea := base64.StdEncoding.EncodeToString(fea.Feats)
                           fmt.Println("perId:",perId)
                           fmt.Println("faceFeature:",base64Fea)
                        }
                     }
                     break
                  }
                  break
               }
            }
         }
         //resultMap[rMsg.Cid] = rMsg
      } else {
         fmt.Println("recv msg Err:",err)
      }