From e1f03b55a1aeb548ec544c68f4a4284f51cf4924 Mon Sep 17 00:00:00 2001 From: Milan Nikolic Date: Wed, 14 Mar 2018 14:33:01 +0100 Subject: [PATCH] Reuse frame --- camera/camera.go | 6 ++++-- camera/camera_cv3.go | 12 +++++++----- video/video.go | 6 ++++-- video/video_cv3.go | 12 +++++++----- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/camera/camera.go b/camera/camera.go index c7fae31..2804f67 100644 --- a/camera/camera.go +++ b/camera/camera.go @@ -13,6 +13,7 @@ import ( // Camera represents camera. type Camera struct { camera *opencv.Capture + frame *opencv.IplImage } // New returns new Camera for given camera index. @@ -30,8 +31,8 @@ func New(index int) (camera *Camera, err error) { // Read reads next frame from camera and returns image. func (c *Camera) Read() (img image.Image, err error) { if c.camera.GrabFrame() { - frame := c.camera.RetrieveFrame(1) - img = frame.ToImage() + c.frame = c.camera.RetrieveFrame(1) + img = c.frame.ToImage() } else { err = fmt.Errorf("camera: can not grab frame") } @@ -56,6 +57,7 @@ func (c *Camera) Close() (err error) { return } + c.frame.Release() c.camera.Release() c.camera = nil return diff --git a/camera/camera_cv3.go b/camera/camera_cv3.go index b6248ff..72fe606 100644 --- a/camera/camera_cv3.go +++ b/camera/camera_cv3.go @@ -13,12 +13,16 @@ import ( // Camera represents camera. type Camera struct { camera *gocv.VideoCapture + frame *gocv.Mat } // New returns new Camera for given camera index. func New(index int) (camera *Camera, err error) { camera = &Camera{} + mat := gocv.NewMat() + camera.frame = &mat + camera.camera, err = gocv.VideoCaptureDevice(index) if err != nil { err = fmt.Errorf("camera: can not open camera %d: %s", index, err.Error()) @@ -29,16 +33,13 @@ func New(index int) (camera *Camera, err error) { // Read reads next frame from camera and returns image. func (c *Camera) Read() (img image.Image, err error) { - mat := gocv.NewMat() - defer mat.Close() - - ok := c.camera.Read(mat) + ok := c.camera.Read(*c.frame) if !ok { err = fmt.Errorf("camera: can not grab frame") return } - img, e := mat.ToImage() + img, e := c.frame.ToImage() if e != nil { err = fmt.Errorf("camera: %v", e) return @@ -64,6 +65,7 @@ func (c *Camera) Close() (err error) { return } + c.frame.Close() err = c.camera.Close() c.camera = nil return diff --git a/video/video.go b/video/video.go index 1894360..5e28532 100644 --- a/video/video.go +++ b/video/video.go @@ -13,6 +13,7 @@ import ( // Video represents video. type Video struct { video *opencv.Capture + frame *opencv.IplImage } // New returns new Video for given path. @@ -30,8 +31,8 @@ func New(filename string) (video *Video, err error) { // Read reads next frame from video and returns image. func (v *Video) Read() (img image.Image, err error) { if v.video.GrabFrame() { - frame := v.video.RetrieveFrame(1) - img = frame.ToImage() + v.frame = v.video.RetrieveFrame(1) + img = v.frame.ToImage() } else { err = fmt.Errorf("video: can not grab frame") } @@ -46,6 +47,7 @@ func (v *Video) Close() (err error) { return } + v.frame.Release() v.video.Release() v.video = nil return diff --git a/video/video_cv3.go b/video/video_cv3.go index f507403..dfaf77e 100644 --- a/video/video_cv3.go +++ b/video/video_cv3.go @@ -13,12 +13,16 @@ import ( // Video represents video. type Video struct { video *gocv.VideoCapture + frame *gocv.Mat } // New returns new Video for given path. func New(filename string) (video *Video, err error) { video = &Video{} + mat := gocv.NewMat() + video.frame = &mat + video.video, err = gocv.VideoCaptureFile(filename) if err != nil { err = fmt.Errorf("video: can not open video %s: %s", filename, err.Error()) @@ -29,16 +33,13 @@ func New(filename string) (video *Video, err error) { // Read reads next frame from video and returns image. func (v *Video) Read() (img image.Image, err error) { - mat := gocv.NewMat() - defer mat.Close() - - ok := v.video.Read(mat) + ok := v.video.Read(*v.frame) if !ok { err = fmt.Errorf("video: can not grab frame") return } - img, e := mat.ToImage() + img, e := v.frame.ToImage() if e != nil { err = fmt.Errorf("video: %v", e) return @@ -54,6 +55,7 @@ func (v *Video) Close() (err error) { return } + v.frame.Close() err = v.video.Close() v.video = nil return