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 }