视频分析2.0 多进程拆分仓库
zhangmeng
2019-05-08 ce15b43db3e60acc65ddd25de253b8577c2693aa
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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)
 
    }
}