From ebe954dab1f8a58d86a0282960591acb05cee479 Mon Sep 17 00:00:00 2001
From: liuxiaolong <736321739@qq.com>
Date: 星期五, 05 七月 2019 19:15:04 +0800
Subject: [PATCH] fix bug
---
service/FaceSdkService.go | 203 +++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 157 insertions(+), 46 deletions(-)
diff --git a/service/FaceSdkService.go b/service/FaceSdkService.go
index 6609997..8275437 100644
--- a/service/FaceSdkService.go
+++ b/service/FaceSdkService.go
@@ -3,14 +3,21 @@
import (
"basic.com/pubsub/protomsg.git"
"basic.com/valib/deliver.git"
- "encoding/base64"
"fmt"
"github.com/gogo/protobuf/proto"
"github.com/pierrec/lz4"
+ "github.com/pkg/errors"
"github.com/satori/go.uuid"
"gocv.io/x/gocv"
+ "sync"
"time"
)
+
+type FaceSdkService struct {
+ File []byte
+ Id string
+ Result []*protomsg.ResultFaceExtCom
+}
const (
Ipc_Push_Ext = "_2.ipc"
@@ -22,6 +29,13 @@
Url_Service_PULL = Ipc_Url_Pre + Virtual_FaceSdkId + Ipc_Pull_Ext
)
+func NewFaceSdkService(fileBytes []byte) FaceSdkService{
+ return FaceSdkService{
+ File:fileBytes,
+ Id:uuid.NewV4().String(),
+ }
+}
+
var imgPushChan chan []byte
var client_push deliver.Deliver
var client_pull deliver.Deliver
@@ -29,33 +43,98 @@
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 {
+ 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)
+
+ 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, err := ioutil.ReadAll(*(s.File))
+ //if err !=nil{
+ // fmt.Println("File.Read err:",err)
+ // return nil,err
+ //}
+
+ picMat, err := gocv.IMDecode(s.File, gocv.IMReadColor)
+ if err !=nil {
+ fmt.Println("gocv.IMDecode err:",err)
+ 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(){
+ var wg sync.WaitGroup
+ wg.Add(1)
+ ticker := time.NewTicker(time.Second * 3)
+ go func(ticker *time.Ticker, s *FaceSdkService) {
+ defer ticker.Stop()
+ defer wg.Done()
+
+ for {
+ select {
+ case <-ticker.C:
+ return
+ default:
+ if feas,ok := resultMap.Get(s.Id);ok {
+ s.Result = feas
+ return
+ }
+ }
+ }
+ }(ticker, s)
+ wg.Wait()
+}
+
+func readTestImgFile() protomsg.Image{
var i protomsg.Image
timeUnix := time.Now().Unix()
formatTimeStr := time.Unix(timeUnix, 0).Format("2006-01-02 15:04:05")
@@ -88,16 +167,40 @@
return i
}
-func PushImgMsg(is []byte) {
+func (s *FaceSdkService) PushImgMsg(is []byte){
imgPushChan <- is
}
-var resultMap map[string]protomsg.SdkMessage
+type FeaResult struct {
+ FeaM map[string][]*protomsg.ResultFaceExtCom
+ Lock sync.Mutex
+}
+
+func (f *FeaResult) Write(id string,faceResult []*protomsg.ResultFaceExtCom){
+ f.Lock.Lock()
+ defer f.Lock.Unlock()
+ f.FeaM[id] = faceResult
+}
+
+func (f *FeaResult) Get(id string) ([]*protomsg.ResultFaceExtCom,bool){
+ f.Lock.Lock()
+ defer f.Lock.Unlock()
+ coms,ok := f.FeaM[id]
+ return coms,ok
+}
+
+func (f *FeaResult) Delete(id string){
+ f.Lock.Lock()
+ defer f.Lock.Unlock()
+ delete(f.FeaM,id)
+}
+
+var resultMap = FeaResult{}
func InitService() {
fmt.Println("service init!")
imgPushChan = make(chan []byte)
- resultMap = make(map[string]protomsg.SdkMessage, 0)
+ resultMap.FeaM = 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() {
@@ -128,7 +231,7 @@
for {
resultBytes, err := client_pull.Recv()
if err != nil {
- fmt.Println("pull err:", err)
+ //fmt.Println("pull err:", err)
continue
}
rMsg := protomsg.SdkMessage{}
@@ -137,41 +240,49 @@
perId := rMsg.Cid //鏁版嵁id
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)
+
+ fmt.Println("Len(sdkInfos)=",len(sdkInfos))
+ for _,swt :=range sdkInfos{
+ //浜鸿劯妫�娴嬬殑缁撴灉
+ //if swt.Sdktype =="FaceDetect"{
+ // fmt.Println("浜鸿劯妫�娴嬬粨鏋滈暱搴︼細",len(swt.Sdkdata))
+ // if len(swt.Sdkdata)>1{
+ // 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("浜鸿劯鎻愬彇缁撴灉闀垮害:",len(swt.Sdkdata))
+ if len(swt.Sdkdata) > 1{
+ 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.Write(perId,pff.ExtComp)
+
+ //for _,fea :=range pff.ExtComp{
+ // base64Fea := base64.StdEncoding.EncodeToString(fea.Feats)
+ // fmt.Println("perId:",perId)
+ // fmt.Println("faceFeature:",base64Fea)
+ //}
+ }
}
+ break
}
- }
- 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))
- for _, fea := range pff.ExtComp {
- base64Fea := base64.StdEncoding.EncodeToString(fea.Feats)
- fmt.Println("perId:", perId)
- fmt.Println("faceFeature:", base64Fea)
- }
- }
- break
}
}
-
}
- //resultMap[rMsg.Cid] = rMsg
} else {
fmt.Println("recv msg Err:", err)
}
--
Gitblit v1.8.0