package demo import ( "analysis/valib/gosdk" srv "analysis/work/service" "image" "image/color" "strconv" "sync" "gocv.io/x/gocv" ) func min(x, y int) int { if x > y { return y } return x } func max(x, y int) int { if x > y { return x } return y } func cvDrawObject(img *gocv.Mat, obj []gosdk.CObjInfo) { clr := color.RGBA{255, 0, 0, 0} clrText := color.RGBA{255, 255, 0, 0} clrTextRect := color.RGBA{0, 255, 255, 0} for k, o := range obj { rect := o.RcObj r := gosdk.Rect(rect) objName := gosdk.YoloObjName(int(o.Typ)) if len(objName) == 0 { continue } text := objName + "-" + strconv.Itoa(k) textSize := gocv.GetTextSize(text, gocv.FontHersheyComplexSmall, 1.2, 2) maxWidth := textSize.X if textSize.X > r.Dx()+2 { maxWidth = r.Dx() + 2 } textRect := image.Rect(max(r.Min.X-1, 0), max(r.Min.Y-30, 0), min(r.Min.X+maxWidth, r.Min.X+r.Dx()-1), min(r.Min.Y, r.Min.Y+r.Dy()-1)) gocv.Rectangle(img, textRect, clrTextRect, -1) textPt := image.Pt(r.Min.X, r.Min.Y-10) gocv.PutText(img, text, textPt, gocv.FontHersheyComplexSmall, 1.2, clrText, 2) gocv.Rectangle(img, r, clr, 3) } } var yoloDetInfo []gosdk.CObjInfo var startYolo bool var m sync.Mutex // ShowYolo show yolo result func ShowYolo(ch <-chan srv.ImageInfo) { cfg := "./data/yolo/cfg/yolov3.cfg" weights := "./data/yolo/yolov3.weights" name := "./data/yolo/data/coco.names" yolo := gosdk.InitYolo(cfg, weights, name, 0) window := gocv.NewWindow("Yolo") pic := gocv.NewMat() for { i := <-ch if !startYolo { go func(yolo *gosdk.YoloHandle, i srv.ImageInfo) { startYolo = true img := gosdk.SDKImage{Data: i.Data, Width: i.Width, Height: i.Height} obj := gosdk.YoloDetect(yolo, img, 0.4, 0) m.Lock() yoloDetInfo = obj m.Unlock() startYolo = false }(yolo, i) } img, _ := gocv.NewMatFromBytes(i.Height, i.Width, gocv.MatTypeCV8UC3, i.Data) var obj []gosdk.CObjInfo m.Lock() obj = yoloDetInfo m.Unlock() cvDrawObject(&img, obj) // show obj gocv.Resize(img, &pic, image.Pt(0, 0), 0.5, 0.5, gocv.InterpolationDefault) window.IMShow(pic) window.WaitKey(1) } }