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跟踪代码及调试 --- gosdk.go | 95 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 95 insertions(+), 0 deletions(-) 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