gobot.io/x/gobot/v2@v2.1.0/platforms/opencv/camera_driver.go (about) 1 package opencv 2 3 import ( 4 "errors" 5 6 "gobot.io/x/gobot/v2" 7 "gocv.io/x/gocv" 8 ) 9 10 type capture interface { 11 Read(img *gocv.Mat) bool 12 } 13 14 const ( 15 // Frame event 16 Frame = "frame" 17 ) 18 19 // CameraDriver is the Gobot Driver for the OpenCV camera 20 type CameraDriver struct { 21 name string 22 camera capture 23 Source interface{} 24 start func(*CameraDriver) (err error) 25 gobot.Eventer 26 } 27 28 // NewCameraDriver creates a new driver with specified source. 29 // It also creates a start function to either set camera as a File or Camera capture. 30 func NewCameraDriver(source interface{}) *CameraDriver { 31 c := &CameraDriver{ 32 name: "Camera", 33 Eventer: gobot.NewEventer(), 34 Source: source, 35 start: func(c *CameraDriver) (err error) { 36 switch v := c.Source.(type) { 37 case string: 38 c.camera, _ = gocv.VideoCaptureFile(v) 39 case int: 40 c.camera, _ = gocv.VideoCaptureDevice(v) 41 default: 42 return errors.New("Unknown camera source") 43 } 44 return 45 }, 46 } 47 48 c.AddEvent(Frame) 49 50 return c 51 } 52 53 // Name returns the Driver name 54 func (c *CameraDriver) Name() string { return c.name } 55 56 // SetName sets the Driver name 57 func (c *CameraDriver) SetName(n string) { c.name = n } 58 59 // Connection returns the Driver's connection 60 func (c *CameraDriver) Connection() gobot.Connection { return nil } 61 62 // Start initializes camera by grabbing frames 63 func (c *CameraDriver) Start() (err error) { 64 if err := c.start(c); err != nil { 65 return err 66 } 67 img := gocv.NewMat() 68 go func() { 69 for { 70 if ok := c.camera.Read(&img); ok { 71 c.Publish(Frame, img) 72 } 73 } 74 }() 75 return 76 } 77 78 // Halt stops camera driver 79 func (c *CameraDriver) Halt() (err error) { return }