派生自 libgowrapper/yolo

zhangmeng
2019-12-11 583c90eb2e8216badbddf65994ab41d0d2eac436
goyolo.go
@@ -11,51 +11,13 @@
*/
import "C"
import (
   "fmt"
   "unsafe"
   "basic.com/pubsub/protomsg.git"
   "github.com/gogo/protobuf/proto"
   "basic.com/libgowrapper/sdkstruct.git"
)
// CPOINT pt
type CPOINT struct {
   X int32
   Y int32
}
// CRECT rc
type CRECT struct {
   Left   int32
   Top    int32
   Right  int32
   Bottom int32
}
// CIMAGE img
type CIMAGE struct {
   Data      *uint8
   Width     int32
   Height    int32
   Channel   int32
   Pad_cgo_0 [4]byte
}
// CObjInfo yolo
type CObjInfo struct {
   RcObj CRECT
   Typ   int32
   Prob  float32
}
// CObjTrackInfo track yolo objs info
type CObjTrackInfo struct {
   ObjInfo CObjInfo
   ID      uint64
}
type trackInfo struct {
   lastTrackObjs []CObjTrackInfo
   lastTrackObjs []sdkstruct.CObjTrackInfo
   lastTrackID   uint64
}
@@ -98,11 +60,11 @@
}
// CYoloObjInfoArrayToGoArray convert cObjInfo array to go
func CYoloObjInfoArrayToGoArray(cArray unsafe.Pointer, count int) (goArray []CObjInfo) {
func CYoloObjInfoArrayToGoArray(cArray unsafe.Pointer, count int) (goArray []sdkstruct.CObjInfo) {
   p := uintptr(cArray)
   for i := 0; i < count; i++ {
      j := *(*CObjInfo)(unsafe.Pointer(p))
      j := *(*sdkstruct.CObjInfo)(unsafe.Pointer(p))
      goArray = append(goArray, j)
      p += unsafe.Sizeof(j)
   }
@@ -110,7 +72,7 @@
}
// YoloDetect yolo detect
func YoloDetect(y *YoloHandle, data []byte, w, h, c int, thrsh float32, umns int) []CObjInfo {
func YoloDetect(y *YoloHandle, data []byte, w, h, c int, thrsh float32, umns int) []sdkstruct.CObjInfo {
   var count C.int
   var cobjinfo unsafe.Pointer
@@ -148,7 +110,7 @@
   return b
}
func countInterAreaOfTwoRect(rect1 CRECT, rect2 CRECT) int32 {
func countInterAreaOfTwoRect(rect1 sdkstruct.CRECT, rect2 sdkstruct.CRECT) int32 {
   xMin := min(rect1.Left, rect2.Left)
   yMin := min(rect1.Top, rect2.Top)
   xMax := max(rect1.Right, rect2.Right)
@@ -176,9 +138,9 @@
}
// YoloDetectTrack2 yolo detect   (只识别人)
func YoloDetectTrack2(y *YoloHandle, LastYoloObjs []CObjTrackInfo, LastTrackID *uint64, data []byte, w, h, c int, thrsh float32, umns int) (allObjs []CObjTrackInfo, newObjs []CObjTrackInfo) {
func YoloDetectTrack2(y *YoloHandle, LastYoloObjs []sdkstruct.CObjTrackInfo, LastTrackID *uint64, data []byte, w, h, c int, thrsh float32, umns int) (allObjs []sdkstruct.CObjTrackInfo, newObjs []sdkstruct.CObjTrackInfo) {
   var tmp CObjTrackInfo
   var tmp sdkstruct.CObjTrackInfo
   //LastYoloObjs
   detectObjs := YoloDetect(y, data, w, h, c, thrsh, umns)
@@ -218,77 +180,9 @@
}
// Run yolo detect   (只识别人)
func Run(i interface{}, id string, data []byte, w, h, c int, thrsh float32, umns int) ([]byte, int) {
func Run(i interface{}, id string, data []byte, w, h, c int, thrsh float32, umns int) ([]sdkstruct.CObjTrackInfo, []sdkstruct.CObjTrackInfo) {
   if data == nil || w <= 0 || h <= 0 {
      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
      return nil, nil
   }
   y := i.(*YoloHandle)
@@ -307,21 +201,5 @@
   y.tracker[id].lastTrackObjs = whole
   y.tracker[id].lastTrackID = v.lastTrackID
   var dWhole, dRecent []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
      }
   }
   if len(recent) > 0 {
      dRecent = nil
   }
   return dWhole, len(whole), dRecent, len(recent)
   return whole, recent
}