Add timestamp option

This commit is contained in:
Milan Nikolic
2019-10-06 05:48:12 +02:00
parent 1c342a67df
commit adf2a742e6
11 changed files with 98 additions and 40 deletions

View File

@@ -66,6 +66,8 @@ Usage of cam2ip:
Disable WebGL drawing of images (html handler) [CAM2IP_NOWEBGL]
-rotate int
Rotate image, valid values are 90, 180, 270 [CAM2IP_ROTATE]
-timestamp
Draws timestamp on images [CAM2IP_TIMESTAMP]
-video-file string
Use video file instead of camera [CAM2IP_VIDEO_FILE]
-width float

View File

@@ -2,8 +2,9 @@ package camera
// Options.
type Options struct {
Index int
Rotate int
Width float64
Height float64
Index int
Rotate int
Width float64
Height float64
Timestamp bool
}

View File

@@ -6,6 +6,11 @@ package camera
import (
"fmt"
"image"
"image/color"
"image/draw"
"time"
"github.com/pbnjay/pixfont"
"github.com/disintegration/imaging"
"github.com/gen2brain/go-opencv/opencv"
@@ -36,29 +41,37 @@ func New(opts Options) (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() {
c.frame = c.camera.RetrieveFrame(1)
if c.frame == nil {
err = fmt.Errorf("camera: can not retrieve frame")
return
}
img = c.frame.ToImage()
if c.opts.Rotate == 0 {
return
}
switch c.opts.Rotate {
case 90:
img = imaging.Rotate90(img)
case 180:
img = imaging.Rotate180(img)
case 270:
img = imaging.Rotate270(img)
}
} else {
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

View File

@@ -6,6 +6,11 @@ package camera
import (
"fmt"
"image"
"image/color"
"image/draw"
"time"
"github.com/pbnjay/pixfont"
"github.com/disintegration/imaging"
"gocv.io/x/gocv"
@@ -56,10 +61,6 @@ func (c *Camera) Read() (img image.Image, err error) {
return
}
if c.opts.Rotate == 0 {
return
}
switch c.opts.Rotate {
case 90:
img = imaging.Rotate90(img)
@@ -69,6 +70,17 @@ func (c *Camera) Read() (img image.Image, err error) {
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
}

View File

@@ -6,10 +6,14 @@ package camera
import (
"fmt"
"image"
"image/color"
"image/draw"
"time"
"github.com/disintegration/imaging"
"github.com/korandiz/v4l"
"github.com/korandiz/v4l/fmt/mjpeg"
"github.com/pbnjay/pixfont"
im "github.com/gen2brain/cam2ip/image"
)
@@ -82,10 +86,6 @@ func (c *Camera) Read() (img image.Image, err error) {
return
}
if c.opts.Rotate == 0 {
return
}
switch c.opts.Rotate {
case 90:
img = imaging.Rotate90(img)
@@ -95,6 +95,17 @@ func (c *Camera) Read() (img image.Image, err error) {
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
}

View File

@@ -7,9 +7,14 @@ import (
"bytes"
"fmt"
"image"
"image/color"
"image/draw"
"syscall"
"time"
"unsafe"
"github.com/pbnjay/pixfont"
"github.com/disintegration/imaging"
)
@@ -129,9 +134,6 @@ func (c *Camera) Read() (img image.Image, err error) {
}
img = c.frame
if c.opts.Rotate == 0 {
return
}
switch c.opts.Rotate {
case 90:
@@ -142,6 +144,17 @@ func (c *Camera) Read() (img image.Image, err error) {
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
}

View File

@@ -27,6 +27,7 @@ func main() {
flag.Float64Var(&srv.FrameHeight, "height", 480, "Frame height")
flag.IntVar(&srv.Rotate, "rotate", 0, "Rotate image, valid values are 90, 180, 270")
flag.BoolVar(&srv.NoWebGL, "nowebgl", false, "Disable WebGL drawing of images (html handler)")
flag.BoolVar(&srv.Timestamp, "timestamp", false, "Draws timestamp on images")
flag.StringVar(&srv.Bind, "bind-addr", ":56000", "Bind address")
flag.StringVar(&srv.Htpasswd, "htpasswd-file", "", "Path to htpasswd file, if empty auth is disabled")
@@ -52,7 +53,7 @@ func main() {
}
}
cam, err := camera.New(camera.Options{srv.Index, srv.Rotate, srv.FrameWidth, srv.FrameHeight})
cam, err := camera.New(camera.Options{srv.Index, srv.Rotate, srv.FrameWidth, srv.FrameHeight, srv.Timestamp})
if err != nil {
fmt.Fprintf(os.Stderr, "%s\n", err.Error())
os.Exit(1)

View File

@@ -28,6 +28,7 @@ func main() {
flag.Float64Var(&srv.FrameHeight, "height", 480, "Frame height")
flag.IntVar(&srv.Rotate, "rotate", 0, "Rotate image, valid values are 90, 180, 270")
flag.BoolVar(&srv.NoWebGL, "nowebgl", false, "Disable WebGL drawing of images (html handler)")
flag.BoolVar(&srv.Timestamp, "timestamp", false, "Draws timestamp on images")
flag.StringVar(&srv.Bind, "bind-addr", ":56000", "Bind address")
flag.StringVar(&srv.Htpasswd, "htpasswd-file", "", "Path to htpasswd file, if empty auth is disabled")
flag.StringVar(&srv.FileName, "video-file", "", "Use video file instead of camera")
@@ -63,7 +64,7 @@ func main() {
srv.Reader = vid
} else {
cam, err := camera.New(camera.Options{srv.Index, srv.Rotate, srv.FrameWidth, srv.FrameHeight})
cam, err := camera.New(camera.Options{srv.Index, srv.Rotate, srv.FrameWidth, srv.FrameHeight, srv.Timestamp})
if err != nil {
fmt.Fprintf(os.Stderr, "%s\n", err.Error())
os.Exit(1)

1
go.mod
View File

@@ -7,6 +7,7 @@ require (
github.com/gen2brain/go-opencv v0.0.0-20191005190506-bf186fc94f7a
github.com/jamiealquiza/envy v1.1.0
github.com/korandiz/v4l v0.0.0-20180520170035-995f703bfc89
github.com/pbnjay/pixfont v0.0.0-20190130005054-401bb7c6aee2
github.com/spf13/cobra v0.0.5 // indirect
gocv.io/x/gocv v0.20.0
golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad // indirect

2
go.sum
View File

@@ -72,6 +72,8 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/pbnjay/pixfont v0.0.0-20190130005054-401bb7c6aee2 h1:Px7Nfku7x0pH6r2G+RlLI5AnXefcH2BAenMxDpZZfIs=
github.com/pbnjay/pixfont v0.0.0-20190130005054-401bb7c6aee2/go.mod h1:wG8B9TIIBxEYqwgBb9NEs/Gz5/ywV351SGZXRiVJJUA=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=

View File

@@ -28,7 +28,8 @@ type Server struct {
Rotate int
NoWebGL bool
NoWebGL bool
Timestamp bool
FileName string