| | |
| | | "analysis/logo" |
| | | "analysis/work" |
| | | "context" |
| | | "time" |
| | | |
| | | "basic.com/valib/gosdk.git" |
| | | ) |
| | |
| | | cfgCloud *gosdk.CPlateIDCloudCfg |
| | | licSrvPath string |
| | | modelPath string |
| | | list *LockList |
| | | fn func(*gosdk.SDKImage, *gosdk.CRECT, int, int, *work.MsgRS, chan<- work.MsgRS) |
| | | } |
| | | |
| | |
| | | return &PlateIDDetector{ |
| | | licSrvPath: licSrv, |
| | | modelPath: model, |
| | | list: NewLockList(6), |
| | | fn: vehicle, |
| | | } |
| | | } |
| | |
| | | cfgCloud: nil, |
| | | licSrvPath: licSrv, |
| | | modelPath: "", |
| | | list: NewLockList(6), |
| | | fn: eparking, |
| | | } |
| | | |
| | |
| | | cfgCloud: cfg, |
| | | licSrvPath: licSrv, |
| | | modelPath: model, |
| | | list: NewLockList(6), |
| | | fn: cloud, |
| | | } |
| | | } |
| | | return nil |
| | | } |
| | | |
| | | // Free free |
| | | func (d *PlateIDDetector) Free() { |
| | | if d.config != nil { |
| | | gosdk.FreePlateIdDetector() |
| | | } else if d.cfgCloud != nil { |
| | | gosdk.FreePlateIDCloudSDKDetector() |
| | | } else { |
| | | gosdk.FreeVehicleITSDetector() |
| | | } |
| | | } |
| | | |
| | | // Init impl |
| | |
| | | return true |
| | | } |
| | | |
| | | func (d *PlateIDDetector) detect(rMsg work.MsgRS, out chan<- work.MsgRS, typ string) { |
| | | i := unpackImage(rMsg, typ) |
| | | if i == nil || i.Data == nil || i.Width <= 0 || i.Height <= 0 { |
| | | ejectResult(nil, rMsg, out) |
| | | return |
| | | } |
| | | |
| | | imgW, imgH := int(i.Width), int(i.Height) |
| | | img := gosdk.SDKImage{Data: i.Data, Width: imgW, Height: imgH} |
| | | |
| | | rcDetect := gosdk.CRECT{ |
| | | Left: 0, |
| | | Top: 0, |
| | | Right: (int32)(imgW), |
| | | Bottom: (int32)(imgH), |
| | | } |
| | | |
| | | mW, mH := 4096, 2160 |
| | | if d.config != nil { |
| | | mW, mH = int(d.config.MaxImageWidth), int(d.config.MaxImageHeight) |
| | | } |
| | | d.fn(&img, &rcDetect, mW, mH, &rMsg, out) |
| | | } |
| | | |
| | | // Run impl |
| | | func (d *PlateIDDetector) Run(ctx context.Context, in <-chan work.MsgRS, out chan<- work.MsgRS, typ string) { |
| | | tm := time.Now() |
| | | sc := 0 |
| | | |
| | | for { |
| | | select { |
| | | case <-ctx.Done(): |
| | | return |
| | | default: |
| | | rMsg := <-in |
| | | if !validRemoteMessage(rMsg, typ) { |
| | | ejectResult(nil, rMsg, out) |
| | | continue |
| | | } |
| | | |
| | | i := unpackImage(rMsg, typ) |
| | | if i == nil || i.Data == nil || i.Width <= 0 || i.Height <= 0 { |
| | | ejectResult(nil, rMsg, out) |
| | | continue |
| | | } |
| | | |
| | | imgW, imgH := int(i.Width), int(i.Height) |
| | | img := gosdk.SDKImage{Data: i.Data, Width: imgW, Height: imgH} |
| | | |
| | | rcDetect := gosdk.CRECT{ |
| | | Left: 0, |
| | | Top: 0, |
| | | Right: (int32)(imgW), |
| | | Bottom: (int32)(imgH), |
| | | } |
| | | |
| | | mW, mH := 4096, 2160 |
| | | if d.config != nil { |
| | | mW, mH = int(d.config.MaxImageWidth), int(d.config.MaxImageHeight) |
| | | } |
| | | d.fn(&img, &rcDetect, mW, mH, &rMsg, out) |
| | | |
| | | sc++ |
| | | if sc == 25 { |
| | | logo.Infoln("PLATE ID DETECTOR RUN 25 FRAME USE TIME: ", time.Since(tm)) |
| | | sc = 0 |
| | | tm = time.Now() |
| | | } |
| | | |
| | | if time.Since(tm) > time.Second { |
| | | logo.Infof("PLATE ID DETECTOR RUN %d FRAME USE TIME: %v", sc, time.Since(tm)) |
| | | sc = 0 |
| | | tm = time.Now() |
| | | } |
| | | |
| | | } |
| | | } |
| | | FlowSimple(ctx, in, out, typ, d.list.Push, d.list.Pop, d.detect, func() { d.Free() }) |
| | | } |
| | | |
| | | func eparking(img *gosdk.SDKImage, rc *gosdk.CRECT, mW, mH int, rMsg *work.MsgRS, out chan<- work.MsgRS) { |