| | |
| | | // RatioInterTrack 跟踪判断重叠阈值 |
| | | const RatioInterTrack = 50 //跟踪判断重叠阈值 |
| | | |
| | | // NewSDKYolo init yolo sdk |
| | | func NewSDKYolo(fc, fw, fn string, gi int) interface{} { |
| | | // NewSDK init yolo sdk |
| | | func NewSDK(fc, fw, fn string, gi int) interface{} { |
| | | |
| | | c := C.CString(fc) |
| | | defer C.free(unsafe.Pointer(c)) |
| | |
| | | } |
| | | |
| | | // Run yolo detect (只识别人) |
| | | func Run(i interface{}, id string, data []byte, w, h, c int, thrsh float32, umns int) ([]byte, []byte) { |
| | | func Run(i interface{}, id string, data []byte, w, h, c int, thrsh float32, umns int) ([]byte, int) { |
| | | if data == nil || w <= 0 || h <= 0 { |
| | | return nil, nil |
| | | return nil, 0 |
| | | } |
| | | y := i.(*YoloHandle) |
| | | |
| | | channel := c |
| | | if channel == 0 { |
| | | channel = 3 |
| | | } |
| | | |
| | | v, ok := y.tracker[id] |
| | | if !ok { |
| | | i := &trackInfo{} |
| | | y.tracker[id] = i |
| | | v = i |
| | | } |
| | | whole, _ := YoloDetectTrack2(y, v.lastTrackObjs, &v.lastTrackID, data, w, h, channel, thrsh, umns) |
| | | y.tracker[id].lastTrackObjs = whole |
| | | y.tracker[id].lastTrackID = v.lastTrackID |
| | | |
| | | var dWhole []byte |
| | | var err error |
| | | if len(whole) > 0 { |
| | | |
| | | infos := convert2ProtoYoloTrack(whole, 1.0, 1.0) |
| | | p := protomsg.ParamYoloObj{Infos: infos} |
| | | |
| | | dWhole, err = proto.Marshal(&p) |
| | | if err != nil { |
| | | fmt.Println("ydetect track marshal proto yolo obj error", err) |
| | | dWhole = nil |
| | | } |
| | | } |
| | | |
| | | return dWhole, len(whole) |
| | | } |
| | | |
| | | func convert2ProtoYoloTrack(obj []CObjTrackInfo, fx, fy float64) []*protomsg.ObjInfo { |
| | | ret := []*protomsg.ObjInfo{} |
| | | |
| | | for _, v := range obj { |
| | | if fx < 1.0 || fy < 1.0 { |
| | | v.ObjInfo.RcObj.Left = (int32)((float64)(v.ObjInfo.RcObj.Left) / fx) |
| | | v.ObjInfo.RcObj.Right = (int32)((float64)(v.ObjInfo.RcObj.Right) / fx) |
| | | v.ObjInfo.RcObj.Top = (int32)((float64)(v.ObjInfo.RcObj.Top) / fy) |
| | | v.ObjInfo.RcObj.Bottom = (int32)((float64)(v.ObjInfo.RcObj.Bottom) / fy) |
| | | } |
| | | |
| | | rect := protomsg.Rect{ |
| | | Left: v.ObjInfo.RcObj.Left, |
| | | Right: v.ObjInfo.RcObj.Right, |
| | | Top: v.ObjInfo.RcObj.Top, |
| | | Bottom: v.ObjInfo.RcObj.Bottom, |
| | | } |
| | | obj := protomsg.ObjInfo{ |
| | | RcObj: &rect, |
| | | Typ: v.ObjInfo.Typ, |
| | | Prob: v.ObjInfo.Prob, |
| | | ObjID: v.ID, |
| | | } |
| | | |
| | | ret = append(ret, &obj) |
| | | } |
| | | return ret |
| | | } |
| | | |
| | | // Run2 yolo detect (只识别人) |
| | | func Run2(i interface{}, id string, data []byte, w, h, c int, thrsh float32, umns int) ([]byte, int, []byte, int) { |
| | | if data == nil || w <= 0 || h <= 0 { |
| | | return nil, 0, nil, 0 |
| | | } |
| | | y := i.(*YoloHandle) |
| | | |
| | |
| | | if len(recent) > 0 { |
| | | dRecent = nil |
| | | } |
| | | return dWhole, dRecent |
| | | } |
| | | |
| | | func convert2ProtoYoloTrack(obj []CObjTrackInfo, fx, fy float64) []*protomsg.ObjInfo { |
| | | ret := []*protomsg.ObjInfo{} |
| | | |
| | | for _, v := range obj { |
| | | if fx < 1.0 || fy < 1.0 { |
| | | v.ObjInfo.RcObj.Left = (int32)((float64)(v.ObjInfo.RcObj.Left) / fx) |
| | | v.ObjInfo.RcObj.Right = (int32)((float64)(v.ObjInfo.RcObj.Right) / fx) |
| | | v.ObjInfo.RcObj.Top = (int32)((float64)(v.ObjInfo.RcObj.Top) / fy) |
| | | v.ObjInfo.RcObj.Bottom = (int32)((float64)(v.ObjInfo.RcObj.Bottom) / fy) |
| | | } |
| | | |
| | | rect := protomsg.Rect{ |
| | | Left: v.ObjInfo.RcObj.Left, |
| | | Right: v.ObjInfo.RcObj.Right, |
| | | Top: v.ObjInfo.RcObj.Top, |
| | | Bottom: v.ObjInfo.RcObj.Bottom, |
| | | } |
| | | obj := protomsg.ObjInfo{ |
| | | RcObj: &rect, |
| | | Typ: v.ObjInfo.Typ, |
| | | Prob: v.ObjInfo.Prob, |
| | | ObjID: v.ID, |
| | | } |
| | | |
| | | ret = append(ret, &obj) |
| | | } |
| | | return ret |
| | | return dWhole, len(whole), dRecent, len(recent) |
| | | } |