视频分析2.0 多进程拆分仓库
zhangmeng
2019-05-06 ffd71d97fc9eb5236e6a92db408745ddf080217b
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)
 
    }
}