1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
| 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)
|
| }
| }
|
|