package main
|
|
import (
|
"basic.com/dbapi.git"
|
"basic.com/pubsub/protomsg.git"
|
"basic.com/valib/deliver.git"
|
"ruleprocess/insertdata"
|
"ruleprocess/labelFilter"
|
"ruleprocess/util"
|
|
//"bufio"
|
//"bytes"
|
"flag"
|
"fmt"
|
"github.com/golang/protobuf/proto"
|
"ruleprocess/logger"
|
//"gocv.io/x/gocv"
|
//"image"
|
//"image/color"
|
//"os"
|
"ruleprocess/cache"
|
"ruleprocess/ruleserver"
|
"sync"
|
)
|
var dbIp = flag.String("dbIp","127.0.0.1","dbserver ip")
|
var dbPort = flag.Int("dbPort",8001,"default dbPort=8001")
|
var surveyPort = flag.Int("surveyPort",40007,"survey port") //心跳
|
var pubPort = flag.Int("pubPort",50007,"pubsub port") //数据更新
|
var initchan = make(chan bool)
|
func init () {
|
// 日志初始化
|
logger.Config("./info.log", logger.DebugLevel)
|
logger.Info("日志初始化成功!")
|
|
}
|
func main() {
|
flag.Parse()
|
wg := sync.WaitGroup{}
|
wg.Add(2)
|
|
dbapi.Init(*dbIp,*dbPort)
|
go cache.Init(initchan,*dbIp,*surveyPort,*pubPort)
|
logger.Info("cache init completed!!!",<- initchan)//dbserver初始化完毕
|
//fmt.Println("缓存初始化完成",<- initchan)//dbserver初始化完毕
|
ruleserver.Init()
|
go ruleserver.TimeTicker()
|
go ruleserver.StartServer()
|
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 {
|
logger.Info("recv error : ", err)
|
fmt.Println("recv error : ", err)
|
continue
|
} else {
|
arg := ruleserver.SdkDatas{}
|
//paramFormat(msg, &arg)
|
m := paramFormat(msg, &arg)
|
// 进行规则处理判断(打上规则的标签)
|
ruleserver.Judge(&arg,&m) // 把sdkMessage传进去,方便缓存数据时拼出一个resultMag
|
// 把arg里的打的标签拿出来给m再封装一层
|
resultMsg := ruleserver.ResultMsg{SdkMessage: &m, RuleResult: arg.RuleResult}
|
// 将打完标签的数据插入到ES
|
insertdata.InsertToEs(resultMsg)
|
//事件推送
|
go labelFilter.Judge(resultMsg)
|
}
|
}
|
}
|
}
|
|
// 将外部传进来的rect(top,bottom,left,right)转化为自己内部的rect(left top width height)
|
func rectFormat(rcobj *protomsg.Rect) ruleserver.Rect {
|
//logger.Info("++++++++++++++++++++++++++++++收到的yolo的区域坐标:",rcobj)
|
rect := ruleserver.Rect{}
|
rect.X = float64(rcobj.Left)
|
rect.Y = float64(rcobj.Top)
|
rect.Width = float64(rcobj.Right - rcobj.Left)
|
rect.Height = float64(rcobj.Bottom - rcobj.Top)
|
return rect
|
}
|
|
// 将外部传进来的sdk数据包解成 SdkDatas
|
func paramFormat(msg []byte, args *ruleserver.SdkDatas) protomsg.SdkMessage {
|
defer func() {
|
if err := recover(); err != nil {
|
logger.Info("解包过程的错误", err.(string))
|
}
|
|
}()
|
// 反序列化数据得到sdk入参
|
m := protomsg.SdkMessage{}
|
err := proto.Unmarshal(msg, &m)
|
if err != nil {
|
panic("解析msg时出现错误")
|
}
|
|
logger.Info("接到数据,摄像机为:",m.Cid)
|
// 先进行一下追踪
|
//ruleserver.FaceIsSame(&m)
|
args.CameraId = m.Cid
|
args.TaskId = m.Tasklab.Taskid
|
// 把图片的二进制解压缩进行画框在压缩回去
|
bdata, err := util.UnCompress(m.Data)
|
if err != nil {
|
panic("解压缩图片时出现错误")
|
}
|
i := protomsg.Image{}
|
err = proto.Unmarshal(bdata, &i)
|
//logger.Info("----------------看看有几个算法:",len(m.Tasklab.Sdkinfos))
|
for _, sdkinfo := range m.Tasklab.Sdkinfos { // yolo算法
|
if sdkinfo.Sdktype == "Yolo" {
|
arg := ruleserver.SdkData{}
|
arg.TaskId = m.Tasklab.Taskid
|
arg.IpcId = sdkinfo.Ipcid
|
arg.IsYolo = true
|
bdata, err := util.UnCompress(m.Data)
|
if err != nil {
|
panic("解压缩图片时出现错误")
|
}
|
i := protomsg.Image{}
|
err = proto.Unmarshal(bdata, &i)
|
arg.ImageWidth = int(i.Width)
|
arg.ImageHeight = int(i.Height)
|
// 暂时写死,sdk还没有这俩算法
|
arg.KeepRight = false
|
arg.IsStatic = false
|
logger.Info("-----追踪之后sdkinfo.Sdkdata的长度为:----",len(sdkinfo.Sdkdata))
|
if len(sdkinfo.Sdkdata) > 1 {
|
// 大于1才有数据
|
yoloParam := protomsg.ParamYoloObj{}
|
err = proto.Unmarshal(sdkinfo.Sdkdata, &yoloParam)
|
if err != nil {
|
logger.Info("解析YOLO sdk数据时出现错误", err)
|
continue
|
}
|
var yoloNum int = 0
|
for _, info := range yoloParam.Infos {
|
if info.Typ == 0 {
|
//logger.Debug("-------------yolo的坐标有几个",info.RcObj)
|
photoMap := ruleserver.PhotoMap{Rects: rectFormat(info.RcObj), Score: float64(info.Prob)*100,IsYolo:true}
|
arg.Photo = append(arg.Photo, photoMap)
|
yoloNum++
|
}
|
}
|
logger.Info("--------------追踪之后yolo的个数:",yoloNum)
|
args.Sdkdata = append(args.Sdkdata,&arg)
|
} else {
|
continue
|
}
|
|
}
|
if sdkinfo.Sdktype == "FaceDetect" { // 人脸检测
|
arg := ruleserver.SdkData{}
|
arg.TaskId = m.Tasklab.Taskid
|
arg.IpcId = sdkinfo.Ipcid
|
arg.IsYolo = false
|
bdata, err := util.UnCompress(m.Data)
|
if err != nil {
|
panic("解压缩图片时出现错误")
|
}
|
i := protomsg.Image{}
|
err = proto.Unmarshal(bdata, &i)
|
arg.ImageWidth = int(i.Width)
|
arg.ImageHeight = int(i.Height)
|
// 暂时写死,sdk还没有这俩算法
|
arg.KeepRight = false
|
arg.IsStatic = false
|
if len(sdkinfo.Sdkdata) > 1 {
|
faceParam := protomsg.ParamFacePos{}
|
err = proto.Unmarshal(sdkinfo.Sdkdata, &faceParam)
|
if err != nil {
|
logger.Info("解析FACE sdk数据时出现错误", err)
|
continue
|
}
|
logger.Info("--------------追踪之后人脸的个数:",len(faceParam.Faces))
|
for _, info := range faceParam.Faces {
|
//logger.Info("_______________________________________________第一次看相似值:",info.Pos.FAngle.Confidence*100)
|
photoMap := ruleserver.PhotoMap{Id:info.Pos.FaceID,Rects: rectFormat(info.Pos.RcFace), Score: float64(info.Pos.FAngle.Confidence*100), IsYolo:false,ThftRes:*(info.Result),Feature:info.Feats}
|
arg.Photo = append(arg.Photo, photoMap)
|
}
|
args.Sdkdata = append(args.Sdkdata,&arg)
|
} else {
|
continue
|
}
|
}
|
}
|
return m
|
}
|