| | |
| | | defer C.free(cImgs) |
| | | for k, v := range imgs { |
| | | ret := C.fill_images(cImgs, C.int(h.batchSize), C.int(k), unsafe.Pointer(&v.Data[0]), C.int(v.Width), C.int(v.Height), C.int(v.Channel)) |
| | | if int(ret) != k { |
| | | return nil, errors.New("fill C images error") |
| | | } |
| | | } |
| | | |
| | | cRet := C.process(h.handle, cImgs, C.int(h.batchSize), h.result) |
| | | if cRet == nil { |
| | | return nil, errors.New("create C results error") |
| | | } |
| | | |
| | | var result []FgResult |
| | | p := uintptr(cRet) |
| | | for i := 0; i < h.batchSize; i++ { |
| | | j := *(*FgResult)(unsafe.Pointer(p)) |
| | | result = append(result, j) |
| | | p += unsafe.Sizeof(j) |
| | | } |
| | | return result, nil |
| | | } |
| | | |
| | | // ProcessImagePointer process |
| | | func (h *HumanTracker) ProcessImagePointer(imgs []*ImageHumanTracker) ([]FgResult, error) { |
| | | if len(imgs) != h.batchSize { |
| | | return nil, errors.New("input images count doesn't equalize to batchsize") |
| | | } |
| | | cImgs := C.create_batch_image(C.int(h.batchSize)) |
| | | if cImgs == nil { |
| | | return nil, errors.New("create C images error") |
| | | } |
| | | defer C.free(cImgs) |
| | | for k, v := range imgs { |
| | | ret := 0 |
| | | if v == nil { |
| | | ret = C.fill_images(cImgs, C.int(h.batchSize), C.int(k), nil, 0, 0, 0) |
| | | } else { |
| | | ret = C.fill_images(cImgs, C.int(h.batchSize), C.int(k), unsafe.Pointer(&v.Data[0]), C.int(v.Width), C.int(v.Height), C.int(v.Channel)) |
| | | } |
| | | if int(ret) != k { |
| | | return nil, errors.New("fill C images error") |
| | | } |
| | |
| | | batchSize int |
| | | flag int |
| | | list *LockList |
| | | |
| | | mapCameraImageIndex map[string]int |
| | | recvImageCount int |
| | | index int |
| | | images [batchSize]*gohumantrack.ImageHumanTracker |
| | | msgs [batchSize]*work.MsgRS |
| | | } |
| | | |
| | | // NewHumanTracker new |
| | |
| | | batchSize: batchSize, |
| | | flag: flag, |
| | | list: NewLockList(6), |
| | | |
| | | recvImageCount: 0, |
| | | index: 0, |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | hr := convert2ProtoHumanTrackResult(res) |
| | | result := protomsg.HumanTrackResult{Result: hr[0]} |
| | | result := protomsg.HumanTrackResult{Result: hr} |
| | | data, err := proto.Marshal(&result) |
| | | if err != nil { |
| | | logo.Errorln("HUMAN TRACKER MARSHAL PROTO PLATE IDS ERROR", err) |
| | |
| | | |
| | | } |
| | | |
| | | func (t *HumanTracker) trackBatch(rMsg work.MsgRS, out chan<- work.MsgRS, typ string) { |
| | | i := unpackImage(rMsg, typ) |
| | | if i == nil || i.Data == nil || i.Width <= 0 || i.Height <= 0 { |
| | | ejectResult(nil, rMsg, out) |
| | | return |
| | | } |
| | | |
| | | imgW, imgH := int(i.Width), int(i.Height) |
| | | |
| | | img := gohumantrack.ImageHumanTracker{ |
| | | Data: i.Data, |
| | | Width: imgW, |
| | | Height: imgH, |
| | | Channel: 3, |
| | | } |
| | | |
| | | // mapCameraImageIndex map[string]int |
| | | // images []gohumantrack.ImageHumanTracker |
| | | |
| | | t.recvImageCount++ |
| | | if t.mapCameraImageIndex == nil { |
| | | t.mapCameraImageIndex = make(map[string]int) |
| | | for i := 0; i < t.batchSize; i++ { |
| | | t.images[i] = nil |
| | | } |
| | | for i := 0; i < t.batchSize; i++ { |
| | | t.msgs[i] = nil |
| | | } |
| | | } |
| | | if i, ok := t.mapCameraImageIndex[rMsg.Msg.Cid]; ok { |
| | | if i < batchSize { |
| | | t.images[i] = &img |
| | | t.msgs[i] = &rMsg |
| | | } |
| | | } else { |
| | | if t.index < batchSize { |
| | | t.images[t.index] = &img |
| | | t.msgs[t.index] = &rMsg |
| | | t.mapCameraImageIndex[rMsg.Msg.Cid] = t.index |
| | | } |
| | | t.index++ |
| | | } |
| | | if t.recvImageCount < t.batchSize+t.batchSize/2 { |
| | | return |
| | | } |
| | | |
| | | res, err := t.tracker.ProcessImagePointer(t.images[:]) |
| | | |
| | | if err != nil { |
| | | t.mapCameraImageIndex = nil |
| | | ejectResult(nil, rMsg, out) |
| | | return |
| | | } |
| | | |
| | | for i := 0; i < t.batchSize; i++ { |
| | | if t.images[i] == nil { |
| | | continue |
| | | } |
| | | hr := convert2ProtoHumanTrackResult(res[i]) |
| | | result := protomsg.HumanTrackResult{Result: hr} |
| | | data, err := proto.Marshal(&result) |
| | | if err != nil { |
| | | logo.Errorln("HUMAN TRACKER MARSHAL PROTO PLATE IDS ERROR", err) |
| | | data = nil |
| | | } |
| | | msg := *t.msgs[i] |
| | | ejectResult(data, msg, out) |
| | | var id, name string |
| | | if msg.Msg.Tasklab != nil { |
| | | id, name = msg.Msg.Tasklab.Taskid, msg.Msg.Tasklab.Taskname |
| | | } |
| | | logo.Infoln("CAMERAID: ", msg.Msg.Cid, " TASKID: ", id, " TASKNAME: ", name, " Human Track COUNT: ", len(hr[0])) |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | // Run impl |
| | | func (t *HumanTracker) Run(ctx context.Context, in <-chan work.MsgRS, out chan<- work.MsgRS, typ string) { |
| | | FlowSimple(ctx, in, out, typ, t.list.Push, t.list.Pop, t.track, t.Free) |
| | | // FlowSimple(ctx, in, out, typ, t.list.Push, t.list.Pop, t.track, t.Free) |
| | | FlowSimple(ctx, in, out, typ, t.list.Push, t.list.Pop, t.trackBatch, t.Free) |
| | | } |
| | | |
| | | // message HumanTrack { |
| | |
| | | // repeated HumanTrack result = 1; |
| | | // } |
| | | |
| | | func convert2ProtoHumanTrackResult(obj []gohumantrack.FgResult) [][]*protomsg.HumanTrack { |
| | | ret := [][]*protomsg.HumanTrack{} |
| | | for _, v := range obj { |
| | | func convert2ProtoHumanTrackResult(obj gohumantrack.FgResult) []*protomsg.HumanTrack { |
| | | res := []*protomsg.HumanTrack{} |
| | | for i := 0; i < int(v.FgNum); i++ { |
| | | r := v.Fginfo[i] |
| | | |
| | | rect := protomsg.Rect{ |
| | | Left: r.Left, |
| | | Right: r.Right, |
| | |
| | | } |
| | | res = append(res, pr) |
| | | } |
| | | ret = append(ret, res) |
| | | } |
| | | return ret |
| | | return res |
| | | } |