diff --git a/README.md b/README.md index d31add6..687d5cf 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,7 @@ You can also use apps like `ffplay` or `vlc`: ### Build tags -* `cv2` - build with `OpenCV` 2.x ([go-opencv](https://github.com/lazywei/go-opencv)) -* `cv4` - build with `OpenCV` 4.x ([gocv](https://github.com/hybridgroup/gocv)) +* `opencv` - use `OpenCV` to access camera ([gocv](https://github.com/hybridgroup/gocv)) * `turbo` - build with `libjpeg-turbo` ([libjpeg-turbo](https://www.libjpeg-turbo.org/)) instead of native Go `image/jpeg` ### Download diff --git a/camera/camera_const_cv.go b/camera/camera_const_cv.go deleted file mode 100644 index a03febb..0000000 --- a/camera/camera_const_cv.go +++ /dev/null @@ -1,47 +0,0 @@ -//go:build cv2 || cv4 -// +build cv2 cv4 - -package camera - -// Property identifiers. -const ( - PropPosMsec = iota - PropPosFrames - PropPosAviRatio - PropFrameWidth - PropFrameHeight - PropFps - PropFourcc - PropFrameCount - PropFormat - PropMode - PropBrightness - PropContrast - PropSaturation - PropHue - PropGain - PropExposure - PropConvertRgb - PropWhiteBalanceU - PropRectification - PropMonocrome - PropSharpness - PropAutoExposure - PropGamma - PropTemperature - PropTrigger - PropTriggerDelay - PropWhiteBalanceV - PropZoom - PropFocus - PropGuid - PropIsoSpeed - PropMaxDc1394 - PropBacklight - PropPan - PropTilt - PropRoll - PropIris - PropSettings - PropBuffersize -) diff --git a/camera/camera_const_linux.go b/camera/camera_const_linux.go deleted file mode 100644 index 3c71f59..0000000 --- a/camera/camera_const_linux.go +++ /dev/null @@ -1,22 +0,0 @@ -//go:build !cv2 && !cv4 && !android -// +build !cv2,!cv4,!android - -package camera - -import ( - "github.com/korandiz/v4l" -) - -// Property identifiers. -const ( - PropBrightness = v4l.CtrlBrightness - PropContrast = v4l.CtrlContrast - PropSaturation = v4l.CtrlSaturation - PropHue = v4l.CtrlHue - PropGain = v4l.CtrlGain - PropExposure = v4l.CtrlExposure - PropWhiteBalanceU = v4l.CtrlWhiteBalance - PropSharpness = v4l.CtrlSharpness - PropWhiteBalanceV = v4l.CtrlDoWhiteBalance - PropBacklight = v4l.CtrlBacklightCompensation -) diff --git a/camera/camera_cv2.go b/camera/camera_cv2.go deleted file mode 100644 index d5112fc..0000000 --- a/camera/camera_cv2.go +++ /dev/null @@ -1,101 +0,0 @@ -//go:build cv2 && !cv4 -// +build cv2,!cv4 - -// Package camera. -package camera - -import ( - "fmt" - "image" - "image/color" - "image/draw" - "time" - - "github.com/disintegration/imaging" - "github.com/gen2brain/go-opencv/opencv" - "github.com/pbnjay/pixfont" -) - -// Camera represents camera. -type Camera struct { - opts Options - camera *opencv.Capture - frame *opencv.IplImage -} - -// New returns new Camera for given camera index. -func New(opts Options) (camera *Camera, err error) { - camera = &Camera{} - camera.opts = opts - - camera.camera = opencv.NewCameraCapture(opts.Index) - if camera.camera == nil { - err = fmt.Errorf("camera: can not open camera %d", opts.Index) - } - - camera.SetProperty(PropFrameWidth, opts.Width) - camera.SetProperty(PropFrameHeight, opts.Height) - - return -} - -// Read reads next frame from camera and returns image. -func (c *Camera) Read() (img image.Image, err error) { - if !c.camera.GrabFrame() { - err = fmt.Errorf("camera: can not grab frame") - return - } - - c.frame = c.camera.RetrieveFrame(1) - if c.frame == nil { - err = fmt.Errorf("camera: can not retrieve frame") - return - } - - img = c.frame.ToImage() - - switch c.opts.Rotate { - case 90: - img = imaging.Rotate90(img) - case 180: - img = imaging.Rotate180(img) - case 270: - img = imaging.Rotate270(img) - } - - if c.opts.Timestamp { - dimg, ok := img.(draw.Image) - if !ok { - err = fmt.Errorf("camera: %T is not a drawable image type", img) - return - } - - pixfont.DrawString(dimg, 10, 10, time.Now().Format("2006-01-02 15:04:05"), color.White) - img = dimg - } - - return -} - -// GetProperty returns the specified camera property. -func (c *Camera) GetProperty(id int) float64 { - return c.camera.GetProperty(id) -} - -// SetProperty sets a camera property. -func (c *Camera) SetProperty(id int, value float64) { - c.camera.SetProperty(id, value) -} - -// Close closes camera. -func (c *Camera) Close() (err error) { - if c.camera == nil { - err = fmt.Errorf("camera: camera is not opened") - return - } - - c.frame.Release() - c.camera.Release() - c.camera = nil - return -} diff --git a/camera/camera_linux.go b/camera/camera_linux.go index f06ba85..88417da 100644 --- a/camera/camera_linux.go +++ b/camera/camera_linux.go @@ -1,5 +1,4 @@ -//go:build !cv2 && !cv4 && !android -// +build !cv2,!cv4,!android +//go:build !opencv && !android // Package camera. package camera @@ -19,6 +18,20 @@ import ( im "github.com/gen2brain/cam2ip/image" ) +// Property identifiers. +const ( + PropBrightness = v4l.CtrlBrightness + PropContrast = v4l.CtrlContrast + PropSaturation = v4l.CtrlSaturation + PropHue = v4l.CtrlHue + PropGain = v4l.CtrlGain + PropExposure = v4l.CtrlExposure + PropWhiteBalanceU = v4l.CtrlWhiteBalance + PropSharpness = v4l.CtrlSharpness + PropWhiteBalanceV = v4l.CtrlDoWhiteBalance + PropBacklight = v4l.CtrlBacklightCompensation +) + // Camera represents camera. type Camera struct { opts Options diff --git a/camera/camera_cv4.go b/camera/camera_opencv.go similarity index 77% rename from camera/camera_cv4.go rename to camera/camera_opencv.go index f039d65..aa11aae 100644 --- a/camera/camera_cv4.go +++ b/camera/camera_opencv.go @@ -1,5 +1,4 @@ -//go:build cv4 && !cv2 -// +build cv4,!cv2 +//go:build opencv // Package camera. package camera @@ -16,6 +15,49 @@ import ( "gocv.io/x/gocv" ) +// Property identifiers. +const ( + PropPosMsec = iota + PropPosFrames + PropPosAviRatio + PropFrameWidth + PropFrameHeight + PropFps + PropFourcc + PropFrameCount + PropFormat + PropMode + PropBrightness + PropContrast + PropSaturation + PropHue + PropGain + PropExposure + PropConvertRgb + PropWhiteBalanceU + PropRectification + PropMonocrome + PropSharpness + PropAutoExposure + PropGamma + PropTemperature + PropTrigger + PropTriggerDelay + PropWhiteBalanceV + PropZoom + PropFocus + PropGuid + PropIsoSpeed + PropMaxDc1394 + PropBacklight + PropPan + PropTilt + PropRoll + PropIris + PropSettings + PropBuffersize +) + // Camera represents camera. type Camera struct { opts Options diff --git a/camera/camera_test.go b/camera/camera_test.go index 62a4ea0..7437be7 100644 --- a/camera/camera_test.go +++ b/camera/camera_test.go @@ -11,7 +11,7 @@ import ( ) func TestCamera(t *testing.T) { - camera, err := New(Options{0, 0, 640, 480}) + camera, err := New(Options{0, 0, 640, 480, false}) if err != nil { t.Fatal(err) } diff --git a/camera/camera_windows.go b/camera/camera_windows.go index 17af2f0..497e142 100644 --- a/camera/camera_windows.go +++ b/camera/camera_windows.go @@ -1,5 +1,4 @@ -//go:build !cv2 && !cv4 -// +build !cv2,!cv4 +//go:build !opencv // Package camera. package camera