package demo
|
|
import (
|
"analysis/valib/gosdk"
|
srv "analysis/work/service"
|
"fmt"
|
"image"
|
"image/color"
|
"math/rand"
|
"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)
|
}
|
}
|
|
type Yolo struct {
|
yoloDetInfo []gosdk.CObjInfo
|
startYolo bool
|
m sync.Mutex
|
}
|
|
func NewYolo() *Yolo {
|
return &Yolo{
|
startYolo: false,
|
}
|
}
|
|
// ShowYolo show yolo result
|
func (y *Yolo) ShowYolo(ch <-chan srv.ImageInfo) {
|
y.ShowYoloWithName(ch, "Yolo")
|
}
|
|
// ShowYoloWithName show yolo result
|
func (y *Yolo) ShowYoloWithName(ch <-chan srv.ImageInfo, winName string) {
|
|
cfg := "./data/yolo/cfg/yolov3.cfg"
|
weights := "./data/yolo/yolov3.weights"
|
name := "./data/yolo/data/coco.names"
|
|
yolo := gosdk.InitYolo(cfg, weights, name, 0)
|
|
winName = winName + strconv.Itoa(rand.Intn(10))
|
window := gocv.NewWindow(winName)
|
|
fmt.Println("create window : ", winName)
|
|
pic := gocv.NewMat()
|
|
for {
|
|
i := <-ch
|
|
if !y.startYolo {
|
go func(yolo *gosdk.YoloHandle, i srv.ImageInfo) {
|
y.startYolo = true
|
img := gosdk.SDKImage{Data: i.Data, Width: i.Width, Height: i.Height}
|
obj := gosdk.YoloDetect(yolo, img, 0.4, 0)
|
|
y.m.Lock()
|
y.yoloDetInfo = obj
|
y.m.Unlock()
|
y.startYolo = false
|
}(yolo, i)
|
}
|
|
img, _ := gocv.NewMatFromBytes(i.Height, i.Width, gocv.MatTypeCV8UC3, i.Data)
|
|
var obj []gosdk.CObjInfo
|
y.m.Lock()
|
obj = y.yoloDetInfo
|
y.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)
|
|
}
|
}
|