mirror of
https://github.com/gen2brain/cam2ip.git
synced 2026-01-10 00:28:32 +00:00
Reuse frame
This commit is contained in:
@@ -13,6 +13,7 @@ import (
|
|||||||
// Camera represents camera.
|
// Camera represents camera.
|
||||||
type Camera struct {
|
type Camera struct {
|
||||||
camera *opencv.Capture
|
camera *opencv.Capture
|
||||||
|
frame *opencv.IplImage
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns new Camera for given camera index.
|
// 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.
|
// Read reads next frame from camera and returns image.
|
||||||
func (c *Camera) Read() (img image.Image, err error) {
|
func (c *Camera) Read() (img image.Image, err error) {
|
||||||
if c.camera.GrabFrame() {
|
if c.camera.GrabFrame() {
|
||||||
frame := c.camera.RetrieveFrame(1)
|
c.frame = c.camera.RetrieveFrame(1)
|
||||||
img = frame.ToImage()
|
img = c.frame.ToImage()
|
||||||
} else {
|
} else {
|
||||||
err = fmt.Errorf("camera: can not grab frame")
|
err = fmt.Errorf("camera: can not grab frame")
|
||||||
}
|
}
|
||||||
@@ -56,6 +57,7 @@ func (c *Camera) Close() (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c.frame.Release()
|
||||||
c.camera.Release()
|
c.camera.Release()
|
||||||
c.camera = nil
|
c.camera = nil
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -13,12 +13,16 @@ import (
|
|||||||
// Camera represents camera.
|
// Camera represents camera.
|
||||||
type Camera struct {
|
type Camera struct {
|
||||||
camera *gocv.VideoCapture
|
camera *gocv.VideoCapture
|
||||||
|
frame *gocv.Mat
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns new Camera for given camera index.
|
// New returns new Camera for given camera index.
|
||||||
func New(index int) (camera *Camera, err error) {
|
func New(index int) (camera *Camera, err error) {
|
||||||
camera = &Camera{}
|
camera = &Camera{}
|
||||||
|
|
||||||
|
mat := gocv.NewMat()
|
||||||
|
camera.frame = &mat
|
||||||
|
|
||||||
camera.camera, err = gocv.VideoCaptureDevice(index)
|
camera.camera, err = gocv.VideoCaptureDevice(index)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = fmt.Errorf("camera: can not open camera %d: %s", index, err.Error())
|
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.
|
// Read reads next frame from camera and returns image.
|
||||||
func (c *Camera) Read() (img image.Image, err error) {
|
func (c *Camera) Read() (img image.Image, err error) {
|
||||||
mat := gocv.NewMat()
|
ok := c.camera.Read(*c.frame)
|
||||||
defer mat.Close()
|
|
||||||
|
|
||||||
ok := c.camera.Read(mat)
|
|
||||||
if !ok {
|
if !ok {
|
||||||
err = fmt.Errorf("camera: can not grab frame")
|
err = fmt.Errorf("camera: can not grab frame")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
img, e := mat.ToImage()
|
img, e := c.frame.ToImage()
|
||||||
if e != nil {
|
if e != nil {
|
||||||
err = fmt.Errorf("camera: %v", e)
|
err = fmt.Errorf("camera: %v", e)
|
||||||
return
|
return
|
||||||
@@ -64,6 +65,7 @@ func (c *Camera) Close() (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c.frame.Close()
|
||||||
err = c.camera.Close()
|
err = c.camera.Close()
|
||||||
c.camera = nil
|
c.camera = nil
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import (
|
|||||||
// Video represents video.
|
// Video represents video.
|
||||||
type Video struct {
|
type Video struct {
|
||||||
video *opencv.Capture
|
video *opencv.Capture
|
||||||
|
frame *opencv.IplImage
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns new Video for given path.
|
// 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.
|
// Read reads next frame from video and returns image.
|
||||||
func (v *Video) Read() (img image.Image, err error) {
|
func (v *Video) Read() (img image.Image, err error) {
|
||||||
if v.video.GrabFrame() {
|
if v.video.GrabFrame() {
|
||||||
frame := v.video.RetrieveFrame(1)
|
v.frame = v.video.RetrieveFrame(1)
|
||||||
img = frame.ToImage()
|
img = v.frame.ToImage()
|
||||||
} else {
|
} else {
|
||||||
err = fmt.Errorf("video: can not grab frame")
|
err = fmt.Errorf("video: can not grab frame")
|
||||||
}
|
}
|
||||||
@@ -46,6 +47,7 @@ func (v *Video) Close() (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
v.frame.Release()
|
||||||
v.video.Release()
|
v.video.Release()
|
||||||
v.video = nil
|
v.video = nil
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -13,12 +13,16 @@ import (
|
|||||||
// Video represents video.
|
// Video represents video.
|
||||||
type Video struct {
|
type Video struct {
|
||||||
video *gocv.VideoCapture
|
video *gocv.VideoCapture
|
||||||
|
frame *gocv.Mat
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns new Video for given path.
|
// New returns new Video for given path.
|
||||||
func New(filename string) (video *Video, err error) {
|
func New(filename string) (video *Video, err error) {
|
||||||
video = &Video{}
|
video = &Video{}
|
||||||
|
|
||||||
|
mat := gocv.NewMat()
|
||||||
|
video.frame = &mat
|
||||||
|
|
||||||
video.video, err = gocv.VideoCaptureFile(filename)
|
video.video, err = gocv.VideoCaptureFile(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = fmt.Errorf("video: can not open video %s: %s", filename, err.Error())
|
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.
|
// Read reads next frame from video and returns image.
|
||||||
func (v *Video) Read() (img image.Image, err error) {
|
func (v *Video) Read() (img image.Image, err error) {
|
||||||
mat := gocv.NewMat()
|
ok := v.video.Read(*v.frame)
|
||||||
defer mat.Close()
|
|
||||||
|
|
||||||
ok := v.video.Read(mat)
|
|
||||||
if !ok {
|
if !ok {
|
||||||
err = fmt.Errorf("video: can not grab frame")
|
err = fmt.Errorf("video: can not grab frame")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
img, e := mat.ToImage()
|
img, e := v.frame.ToImage()
|
||||||
if e != nil {
|
if e != nil {
|
||||||
err = fmt.Errorf("video: %v", e)
|
err = fmt.Errorf("video: %v", e)
|
||||||
return
|
return
|
||||||
@@ -54,6 +55,7 @@ func (v *Video) Close() (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
v.frame.Close()
|
||||||
err = v.video.Close()
|
err = v.video.Close()
|
||||||
v.video = nil
|
v.video = nil
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user