package main
|
|
import (
|
"fmt"
|
"ruleprocess/ruleserver"
|
"sync"
|
|
"basic.com/pubsub/protomsg.git"
|
"basic.com/valib/deliver.git"
|
"github.com/golang/protobuf/proto"
|
)
|
|
func main() {
|
wg := sync.WaitGroup{}
|
wg.Add(1)
|
go ruleserver.TimeTicker()
|
nReciever("ipc:///tmp/sdk-2-rules-process.ipc", deliver.PushPull, 1)
|
wg.Wait()
|
}
|
func nReciever(url string, m deliver.Mode, count int) {
|
c := deliver.NewServer(m, url)
|
nRecvImpl(c, 1)
|
}
|
|
func nRecvImpl(c deliver.Deliver, index int) {
|
|
var msg []byte
|
var err error
|
|
for {
|
select {
|
// case <-ctx.Done():
|
// return
|
default:
|
msg, err = c.Recv()
|
if err != nil {
|
fmt.Println("recv error : ", err)
|
continue
|
} else {
|
arg := ruleserver.ArgsFromSdk{}
|
m := paramFormat(msg,&arg)
|
arg.MainJudge()
|
// 把arg里的打的标签拿出来给m再封装一层
|
resultMag := ruleserver.ResultMsg{SdkMessage: m, RuleResult: arg.RuleResult}
|
fmt.Println("打完标签后的结果:",resultMag)
|
}
|
}
|
}
|
}
|
|
// 将外部传进来的sdk数据包解成 ArgsFromSdk
|
func paramFormat(msg []byte,arg *ruleserver.ArgsFromSdk) protomsg.SdkMessage {
|
// 反序列化数据得到sdk入参
|
m := protomsg.SdkMessage{}
|
err := proto.Unmarshal(msg, &m)
|
if err != nil {
|
fmt.Println("解析msg时出现错误", err)
|
return m
|
}
|
arg.CameraId = m.Cid
|
arg.TaskId = m.Tasklab.Taskid
|
|
i := protomsg.Image{}
|
err = proto.Unmarshal(m.Data, &i)
|
arg.ImageWidth = int(i.Width)
|
arg.ImageHeight = int(i.Height)
|
// 暂时写死,sdk还没有这俩算法
|
arg.KeepRight = false
|
arg.IsStatic = false
|
fmt.Println("从mongos中拿到的数据包长度为:", len(msg))
|
for _, sdkinfo := range m.Tasklab.Sdkinfos {
|
if sdkinfo.Sdktype == "yolo" {
|
yoloParam := protomsg.ParamYoloObj{}
|
err = proto.Unmarshal(sdkinfo.Sdkdata, &yoloParam)
|
if err != nil {
|
fmt.Println("解析sdk数据时出现错误", err)
|
continue
|
}
|
for _, info := range yoloParam.Infos {
|
photoMap := ruleserver.PhotoMap{Rects:rectFormat(info.RcObj, i.Width, i.Height), Score: float64(info.Prob)}
|
arg.Photo = append(arg.Photo, photoMap)
|
}
|
|
}
|
}
|
return m
|
}
|
|
// 将外部传进来的rect(top,bottom,left,right)转化为自己内部的rect(left top width height)
|
func rectFormat(rcobj *protomsg.Rect, width int32, height int32) ruleserver.Rect {
|
rect := ruleserver.Rect{}
|
rect.X = float64(rcobj.Left)
|
rect.Y = float64(rcobj.Top)
|
rect.Width = float64(width - rcobj.Left - rcobj.Right)
|
rect.Height = float64(height - rcobj.Top - rcobj.Bottom)
|
return rect
|
}
|