From deb2e7127b5e9315eaad9de95b47fa82e0c8dffd Mon Sep 17 00:00:00 2001
From: chenshijun <csj_sky@126.com>
Date: 星期三, 10 七月 2019 17:20:51 +0800
Subject: [PATCH] yolo跟踪代码及调试
---
go2c.go | 86 +++++++++++----------
gosdk.go | 95 +++++++++++++++++++++++
2 files changed, 141 insertions(+), 40 deletions(-)
diff --git a/go2c.go b/go2c.go
index b4c6274..0aaa446 100644
--- a/go2c.go
+++ b/go2c.go
@@ -4,58 +4,64 @@
package gosdk
type CPOINT struct {
- X int32
- Y int32
+ X int32
+ Y int32
}
type CRECT struct {
- Left int32
- Top int32
- Right int32
- Bottom int32
+ Left int32
+ Top int32
+ Right int32
+ Bottom int32
}
type CIMAGE struct {
- Data *uint8
- Width int32
- Height int32
- Channel int32
- Pad_cgo_0 [4]byte
+ Data *uint8
+ Width int32
+ Height int32
+ Channel int32
+ Pad_cgo_0 [4]byte
}
type CFaceAngle struct {
- Yaw int32
- Pitch int32
- Roll int32
- Confidence float32
+ Yaw int32
+ Pitch int32
+ Roll int32
+ Confidence float32
}
type CThftResult struct {
- Gender int32
- Age int32
- Race int32
- Beauty_level int32
- Smile_level int32
+ Gender int32
+ Age int32
+ Race int32
+ Beauty_level int32
+ Smile_level int32
}
type CFacePos struct {
- RcFace CRECT
- PtLeftEye CPOINT
- PtRightEye CPOINT
- PtMouth CPOINT
- PtNose CPOINT
- FAngle CFaceAngle
- NQuality int32
- PFacialData [512]uint8
+ RcFace CRECT
+ PtLeftEye CPOINT
+ PtRightEye CPOINT
+ PtMouth CPOINT
+ PtNose CPOINT
+ FAngle CFaceAngle
+ NQuality int32
+ PFacialData [512]uint8
}
type CFaceInfo struct {
- RcFace CRECT
- PtLeftEye CPOINT
- PtRightEye CPOINT
- PtMouth CPOINT
- PtNose CPOINT
- FAngle CFaceAngle
- NQuality int32
- PFacialData [8192]uint8
- NFaceID int64
+ RcFace CRECT
+ PtLeftEye CPOINT
+ PtRightEye CPOINT
+ PtMouth CPOINT
+ PtNose CPOINT
+ FAngle CFaceAngle
+ NQuality int32
+ PFacialData [8192]uint8
+ NFaceID int64
}
type CObjInfo struct {
- RcObj CRECT
- Typ int32
- Prob float32
+ RcObj CRECT
+ Typ int32
+ Prob float32
+}
+
+//track yolo objs info
+type CObjTrackInfo struct {
+ ObjInfo CObjInfo
+ ID uint64
}
diff --git a/gosdk.go b/gosdk.go
index 240cfdb..3e230d4 100644
--- a/gosdk.go
+++ b/gosdk.go
@@ -26,6 +26,10 @@
Height int
}
+var LastYoloObjs []CObjTrackInfo //yolo璺熻釜鐨勪笂涓�甯т俊鎭�
+var LastTrackID uint64 = 0 //yolo 琚娇鐢ㄧ殑ID
+const RatioInterTrack = 50 //璺熻釜鍒ゆ柇閲嶅彔闃堝��
+
// InitYolo init yolo sdk
func InitYolo(fc, fw, fn string, gi int) *YoloHandle {
@@ -236,3 +240,94 @@
return C.GoString(p)
}
+
+func max(a, b int32) int32 {
+ if a < b {
+ return b
+ }
+ return a
+}
+
+func min(a, b int32) int32 {
+ if a < b {
+ return a
+ }
+ return b
+}
+
+func countInterAreaOfTwoRect(rect1 CRECT, rect2 CRECT) int32 {
+ xMin := min(rect1.Left, rect2.Left)
+ yMin := min(rect1.Top, rect2.Top)
+ xMax := max(rect1.Right, rect2.Right)
+ yMax := max(rect1.Bottom, rect2.Bottom)
+
+ wRect1 := rect1.Right - rect1.Left
+ hRect1 := rect1.Bottom - rect1.Top
+
+ wRect2 := rect2.Right - rect2.Left
+ hRect2 := rect2.Bottom - rect2.Top
+
+ wInter := wRect1 + wRect2 - (xMax - xMin)
+ hInter := hRect1 + hRect2 - (yMax - yMin)
+
+ if (wInter <= 0) || (hInter <= 0) {
+ return 0
+ }
+
+ areaInter := wInter * hInter
+ areaRect1 := wRect1 * hRect1
+ areaRect2 := wRect2 * hRect2
+ ratio := areaInter * 100 / min(areaRect1, areaRect2)
+
+ return ratio
+}
+
+// YoloDetect yolo detect (鍙瘑鍒汉)
+func YoloDetectTrack(handle *YoloHandle, img SDKImage, thrsh float32, umns int) (allObjs []CObjTrackInfo, newObjs []CObjTrackInfo) {
+
+ var tmp CObjTrackInfo
+ //LastYoloObjs
+ detectObjs := YoloDetect(handle, img, thrsh, umns)
+ for i := 0; i < len(detectObjs); i++ {
+ if detectObjs[i].Typ != 0 {
+ detectObjs = append(detectObjs[:i], detectObjs[i+1:]...) //浠庢娴嬬洰鏍囬噷鍒犻櫎宸茬粡鏌ュ埌鐨勮窡韪洰鏍�
+ i--
+ }
+ }
+
+ for _, vLast := range LastYoloObjs {
+ for i := 0; i < len(detectObjs); i++ {
+ //fmt.Println("vNew.Typ:", vNew.Typ)
+ if vLast.ObjInfo.Typ == detectObjs[i].Typ { //鍚屼竴绫诲埆锛屾瘮濡傞兘鏄汉浣�
+ ratio := countInterAreaOfTwoRect(vLast.ObjInfo.RcObj, detectObjs[i].RcObj)
+ if ratio >= RatioInterTrack {
+ //update LastYoloObjs
+ vLast.ObjInfo.RcObj = detectObjs[i].RcObj
+ vLast.ObjInfo.Prob = detectObjs[i].Prob
+
+ allObjs = append(allObjs, vLast)
+ detectObjs = append(detectObjs[:i], detectObjs[i+1:]...) //浠庢娴嬬洰鏍囬噷鍒犻櫎宸茬粡鏌ュ埌鐨勮窡韪洰鏍�
+ i--
+ break //涓婁竴甯ц窡韪殑鐩爣宸茬粡鎵惧埌锛屾棤闇�寰�涓嬪鐞嗗叾浠栨娴嬬洰鏍�
+ }
+ }
+ }
+ }
+
+ //澶勭悊鏂板嚭鐜扮殑鐩爣
+ if len(detectObjs) > 0 {
+ for _, vAdd := range detectObjs {
+ tmp.ObjInfo = vAdd
+ tmp.ID = LastTrackID
+ LastTrackID++
+
+ allObjs = append(allObjs, tmp)
+ newObjs = append(newObjs, tmp)
+ }
+ }
+
+ //鍒锋柊涓婁竴甯х殑璺熻釜鐩爣
+ LastYoloObjs = allObjs
+
+ return allObjs, newObjs
+}
--
Gitblit v1.8.0