Skip to content

Commit b9b72c4

Browse files
committed
inital implemenatation of KalmanBlobie
1 parent 9ea514f commit b9b72c4

File tree

5 files changed

+330
-52
lines changed

5 files changed

+330
-52
lines changed

v2/go.mod

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ module github.com/LdDl/gocv-blob/v2
33
go 1.16
44

55
require (
6+
github.com/LdDl/kalman-filter v0.1.1
7+
github.com/pkg/errors v0.9.1 // indirect
68
github.com/satori/go.uuid v1.2.0
7-
gocv.io/x/gocv v0.23.0
8-
)
9+
gocv.io/x/gocv v0.26.0
10+
gonum.org/v1/gonum v0.9.1 // indirect
11+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
12+
)

v2/go.sum

Lines changed: 81 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,83 @@
1+
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
2+
gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
3+
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
4+
github.com/LdDl/kalman-filter v0.1.0 h1:u8kOumOB0xSjoPIy6q8mo0stKrj4cuhsJ5JSVolA91s=
5+
github.com/LdDl/kalman-filter v0.1.0/go.mod h1:3zuy/ZAUsDoVpDhCZ/UPjriNnFunwR0DMf6iLDzZ3Cw=
6+
github.com/LdDl/kalman-filter v0.1.1 h1:HAfi2q9PVxvFt/O8hfn78ekTwFBZJDuuKQaUqnph1vc=
7+
github.com/LdDl/kalman-filter v0.1.1/go.mod h1:3zuy/ZAUsDoVpDhCZ/UPjriNnFunwR0DMf6iLDzZ3Cw=
8+
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
9+
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
10+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
11+
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
12+
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
13+
github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=
14+
github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=
15+
github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
16+
github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=
17+
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
18+
github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=
19+
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
20+
github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
21+
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
22+
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
23+
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
24+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
25+
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
26+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
27+
github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=
28+
github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
29+
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
30+
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
31+
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
32+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
33+
github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
134
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
235
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
3-
gocv.io/x/gocv v0.23.0 h1:3Fgbt06/uR8Zf9emWndhjbUjdrw+nto69R/b4noFydY=
4-
gocv.io/x/gocv v0.23.0/go.mod h1:Rar2PS6DV+T4FL+PM535EImD/h13hGVaHhnCu1xarBs=
36+
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
37+
gocv.io/x/gocv v0.26.0 h1:1azNvYEM245YN1bdw/WdX5YJzLg3Sr4STX0MqdWBIXM=
38+
gocv.io/x/gocv v0.26.0/go.mod h1:7Ju5KbPo+R85evmlhhKPVMwXtgDRNX/PtfVfbToSrLU=
39+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
40+
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
41+
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
42+
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
43+
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
44+
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
45+
golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3 h1:n9HxLrNxWWtEb1cA950nuEEj3QnKbtsCJ6KjcgisNUs=
46+
golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=
47+
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
48+
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
49+
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
50+
golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
51+
golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
52+
golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
53+
golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
54+
golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
55+
golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
56+
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
57+
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
58+
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
59+
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
60+
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
61+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
62+
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
63+
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
64+
golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
65+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
66+
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
67+
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
68+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
69+
golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
70+
golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
71+
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
72+
gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
73+
gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
74+
gonum.org/v1/gonum v0.9.0/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=
75+
gonum.org/v1/gonum v0.9.1 h1:HCWmqqNoELL0RAQeKBXWtkp04mGk8koafcB4He6+uhc=
76+
gonum.org/v1/gonum v0.9.1/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=
77+
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc=
78+
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
79+
gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
80+
gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=
81+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
82+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
83+
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=

v2/kalman_blob.go

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
package blob
22

33
import (
4+
"fmt"
45
"image"
6+
"math"
57
"time"
68

9+
kf "github.com/LdDl/kalman-filter"
10+
"github.com/pkg/errors"
11+
"gonum.org/v1/gonum/mat"
12+
713
uuid "github.com/satori/go.uuid"
814
)
915

@@ -27,7 +33,147 @@ type KalmanBlobie struct {
2733
classID int
2834
className string
2935

36+
// Kalman filter wrapping
37+
pointTracker *kf.PointTracker
38+
yMatrix *mat.Dense
39+
uMatrix *mat.Dense
40+
dt float64
41+
3042
// For array tracker
3143
drawingOptions *DrawOptions
3244
crossedLine bool
3345
}
46+
47+
// NewKalmanBlobie - Constructor for KalmanBlobie (default values)
48+
func NewKalmanBlobie(rect image.Rectangle, maxPointsInTrack int, dT float64, classID int, className string) Blobie {
49+
center := image.Pt((rect.Min.X*2+rect.Dx())/2, (rect.Min.Y*2+rect.Dy())/2)
50+
width := float64(rect.Dx())
51+
height := float64(rect.Dy())
52+
centerX, centerY := float64(center.X), float64(center.Y)
53+
kalmanBlobie := KalmanBlobie{
54+
CurrentRect: rect,
55+
Center: center,
56+
Area: width * height,
57+
Diagonal: math.Sqrt(math.Pow(width, 2) + math.Pow(height, 2)),
58+
AspectRatio: width / height,
59+
Track: []image.Point{center},
60+
TrackTime: []time.Time{time.Now()},
61+
maxPointsInTrack: maxPointsInTrack,
62+
isExists: true,
63+
isStillBeingTracked: true,
64+
noMatchTimes: 0,
65+
pointTracker: kf.NewPointTracker(),
66+
yMatrix: mat.NewDense(2, 1, []float64{centerX, centerY}),
67+
uMatrix: mat.NewDense(4, 1, []float64{0.0, 0.0, 0.0, 0.0}),
68+
dt: dT,
69+
classID: classID,
70+
className: className,
71+
crossedLine: false,
72+
}
73+
kalmanBlobie.pointTracker.SetStateValue(centerX, centerY, 0, 0)
74+
kalmanBlobie.pointTracker.SetTime(dT)
75+
76+
return &kalmanBlobie
77+
}
78+
79+
// PredictNextPosition - Predict next N coordinates
80+
func (b *KalmanBlobie) PredictNextPosition(n int) {
81+
account := min(n, len((*b).Track))
82+
prev := len((*b).Track) - 1
83+
current := prev - 1
84+
var deltaX, deltaY, sum int = 0, 0, 0
85+
for i := 1; i < int(account); i++ {
86+
deltaX += (((*b).Track)[current].X - ((*b).Track)[prev].X) * i
87+
deltaY += (((*b).Track)[current].Y - ((*b).Track)[prev].Y) * i
88+
sum += i
89+
}
90+
if sum > 0 {
91+
deltaX /= sum
92+
deltaY /= sum
93+
}
94+
(*b).PredictedNextPosition.X = (*b).Track[len((*b).Track)-1].X + deltaX
95+
(*b).PredictedNextPosition.Y = (*b).Track[len((*b).Track)-1].Y + deltaY
96+
}
97+
98+
// Update - Update info about blob
99+
func (b *KalmanBlobie) Update(newb Blobie) error {
100+
var newbCast *KalmanBlobie
101+
switch newb.(type) {
102+
case *KalmanBlobie:
103+
newbCast = newb.(*KalmanBlobie)
104+
break
105+
default:
106+
return fmt.Errorf("KalmanBlobie.Update() method must accept interface of type *KalmanBlobie")
107+
}
108+
newCenterX, newCenterY := float64(newbCast.Center.X), float64(newbCast.Center.Y)
109+
110+
// Reset y
111+
b.yMatrix.Set(0, 0, newCenterX)
112+
b.yMatrix.Set(1, 0, newCenterY)
113+
114+
// Reset u
115+
b.uMatrix.Set(0, 0, 0.0)
116+
b.uMatrix.Set(1, 0, 0.0)
117+
b.uMatrix.Set(2, 0, 0.0)
118+
b.uMatrix.Set(3, 0, 0.0)
119+
120+
// Evaluate state
121+
state, err := b.pointTracker.Process(b.yMatrix, b.uMatrix)
122+
if err != nil {
123+
return errors.Wrap(err, "Can't process linear Kalman filter")
124+
}
125+
kalmanX, kalmanY := int(state.At(0, 0)), int(state.At(1, 0))
126+
b.CurrentRect = newbCast.CurrentRect
127+
b.Center = image.Point{kalmanX, kalmanY}
128+
diffX, diffY := kalmanX-newbCast.Center.X, kalmanY-newbCast.Center.Y
129+
b.CurrentRect = image.Rect(newbCast.CurrentRect.Min.X-diffX, newbCast.CurrentRect.Min.Y-diffY, newbCast.CurrentRect.Max.X-diffX, newbCast.CurrentRect.Max.Y-diffY)
130+
b.Area = newbCast.Area
131+
b.Diagonal = newbCast.Diagonal
132+
b.AspectRatio = newbCast.AspectRatio
133+
b.isStillBeingTracked = true
134+
b.isExists = true
135+
// Append new point to track
136+
b.Track = append(b.Track, newbCast.Center)
137+
b.TrackTime = append(b.TrackTime, newbCast.TrackTime[len(newbCast.TrackTime)-1])
138+
// Restrict number of points in track (shift to the left)
139+
if len(b.Track) > b.maxPointsInTrack {
140+
b.Track = b.Track[1:]
141+
}
142+
return nil
143+
}
144+
145+
func (sb *KalmanBlobie) GetCenter() image.Point {
146+
return sb.Center
147+
}
148+
149+
func (sb *KalmanBlobie) GetDiagonal() float64 {
150+
return sb.Diagonal
151+
}
152+
153+
func (sb *KalmanBlobie) GetPredictedNextPosition() image.Point {
154+
return sb.PredictedNextPosition
155+
}
156+
157+
func (sb *KalmanBlobie) NoMatchTimes() int {
158+
return sb.noMatchTimes
159+
}
160+
161+
func (sb *KalmanBlobie) Exists() bool {
162+
return sb.isExists
163+
}
164+
165+
func (sb *KalmanBlobie) SetID(id uuid.UUID) {
166+
sb.ID = id
167+
}
168+
169+
func (sb *KalmanBlobie) SetTracking(isStillBeingTracked bool) {
170+
sb.isStillBeingTracked = isStillBeingTracked
171+
}
172+
173+
func (sb *KalmanBlobie) IncrementNoMatchTimes() {
174+
sb.noMatchTimes++
175+
}
176+
177+
func (sb *KalmanBlobie) SetExists(isExists bool) {
178+
sb.isExists = isExists
179+
}

v2/line_cross.go

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package blob
2+
3+
// IsCrossedTheLine - Check if blob crossed the HORIZONTAL line
4+
func (b *SimpleBlobie) IsCrossedTheLine(vertical, leftX, rightX int, direction bool) bool {
5+
trackLen := len(b.Track)
6+
if b.isStillBeingTracked == true && trackLen >= 2 && b.crossedLine == false {
7+
prevFrame := trackLen - 2
8+
currFrame := trackLen - 1
9+
if b.Track[currFrame].X >= leftX && b.Track[currFrame].X <= rightX {
10+
if direction {
11+
12+
if b.Track[prevFrame].Y <= vertical && b.Track[currFrame].Y > vertical { // TO us
13+
b.crossedLine = true
14+
return true
15+
}
16+
} else {
17+
if b.Track[prevFrame].Y > vertical && b.Track[currFrame].Y <= vertical { // FROM us
18+
b.crossedLine = true
19+
return true
20+
}
21+
}
22+
}
23+
}
24+
return false
25+
}
26+
27+
// IsCrossedTheLineWithShift - Check if blob crossed the HORIZONTAL line with shift along the Y-axis
28+
// Purpose of this for "predicative" cropping when detection line very close to bottom of image
29+
func (b *SimpleBlobie) IsCrossedTheLineWithShift(vertical, leftX, rightX int, direction bool, shift int) bool {
30+
trackLen := len(b.Track)
31+
if b.isStillBeingTracked == true && trackLen >= 2 && b.crossedLine == false {
32+
prevFrame := trackLen - 2
33+
currFrame := trackLen - 1
34+
if b.Track[currFrame].X >= leftX && b.Track[currFrame].X <= rightX {
35+
if direction {
36+
if (b.Track[prevFrame].Y+shift) <= vertical && (b.Track[currFrame].Y+shift) > vertical { // TO us
37+
b.crossedLine = true
38+
return true
39+
}
40+
} else {
41+
if (b.Track[prevFrame].Y+shift) > vertical && (b.Track[currFrame].Y+shift) <= vertical { // FROM us
42+
b.crossedLine = true
43+
return true
44+
}
45+
}
46+
}
47+
}
48+
return false
49+
}
50+
51+
// IsCrossedTheLine - Check if blob crossed the HORIZONTAL line
52+
func (b *KalmanBlobie) IsCrossedTheLine(vertical, leftX, rightX int, direction bool) bool {
53+
trackLen := len(b.Track)
54+
if b.isStillBeingTracked == true && trackLen >= 2 && b.crossedLine == false {
55+
prevFrame := trackLen - 2
56+
currFrame := trackLen - 1
57+
if b.Track[currFrame].X >= leftX && b.Track[currFrame].X <= rightX {
58+
if direction {
59+
60+
if b.Track[prevFrame].Y <= vertical && b.Track[currFrame].Y > vertical { // TO us
61+
b.crossedLine = true
62+
return true
63+
}
64+
} else {
65+
if b.Track[prevFrame].Y > vertical && b.Track[currFrame].Y <= vertical { // FROM us
66+
b.crossedLine = true
67+
return true
68+
}
69+
}
70+
}
71+
}
72+
return false
73+
}
74+
75+
// IsCrossedTheLineWithShift - Check if blob crossed the HORIZONTAL line with shift along the Y-axis
76+
// Purpose of this for "predicative" cropping when detection line very close to bottom of image
77+
func (b *KalmanBlobie) IsCrossedTheLineWithShift(vertical, leftX, rightX int, direction bool, shift int) bool {
78+
trackLen := len(b.Track)
79+
if b.isStillBeingTracked == true && trackLen >= 2 && b.crossedLine == false {
80+
prevFrame := trackLen - 2
81+
currFrame := trackLen - 1
82+
if b.Track[currFrame].X >= leftX && b.Track[currFrame].X <= rightX {
83+
if direction {
84+
if (b.Track[prevFrame].Y+shift) <= vertical && (b.Track[currFrame].Y+shift) > vertical { // TO us
85+
b.crossedLine = true
86+
return true
87+
}
88+
} else {
89+
if (b.Track[prevFrame].Y+shift) > vertical && (b.Track[currFrame].Y+shift) <= vertical { // FROM us
90+
b.crossedLine = true
91+
return true
92+
}
93+
}
94+
}
95+
}
96+
return false
97+
}

0 commit comments

Comments
 (0)