mirror of
https://github.com/kerberos-io/agent.git
synced 2026-10-19 17:38:25 +00:00
add resizing methods
This commit is contained in:
@@ -7,6 +7,7 @@ require (
|
||||
github.com/appleboy/gin-jwt/v2 v2.9.1
|
||||
github.com/cedricve/go-onvif v0.0.0-20200222191200-567e8ce298f6
|
||||
github.com/deepch/vdk v0.0.19
|
||||
github.com/disintegration/imaging v1.6.2
|
||||
github.com/eclipse/paho.mqtt.golang v1.4.2
|
||||
github.com/gin-contrib/cors v1.4.0
|
||||
github.com/gin-contrib/pprof v1.4.0
|
||||
@@ -86,6 +87,7 @@ require (
|
||||
github.com/yusufpapurcu/wmi v1.2.2 // indirect
|
||||
github.com/ziutek/mymysql v1.5.4 // indirect
|
||||
golang.org/x/crypto v0.4.0 // indirect
|
||||
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 // indirect
|
||||
golang.org/x/net v0.4.0 // indirect
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect
|
||||
golang.org/x/sys v0.3.0 // indirect
|
||||
|
||||
@@ -26,6 +26,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/deepch/vdk v0.0.19 h1:r6xYyBTtXEIEh+csO0XHT00sI7xLF+hQFkJE9/go5II=
|
||||
github.com/deepch/vdk v0.0.19/go.mod h1:7ydHfSkflMZxBXfWR79dMjrT54xzvLxnPaByOa9Jpzg=
|
||||
github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
|
||||
github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
|
||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6rNA5PM12m4=
|
||||
github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA=
|
||||
@@ -297,6 +299,8 @@ golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0
|
||||
golang.org/x/crypto v0.0.0-20221010152910-d6f0a8c073c2/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8=
|
||||
golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80=
|
||||
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 h1:hVwzHzIUGRjiF7EcUjqNxk3NCfkPxbDKRdnNE1Rpg0U=
|
||||
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
|
||||
|
||||
@@ -285,7 +285,8 @@ func HandleLiveStreamSD(livestreamCursor *pubsub.QueueCursor, configuration *mod
|
||||
func sendImage(topic string, mqttClient mqtt.Client, pkt av.Packet, decoder *ffmpeg.VideoDecoder, decoderMutex *sync.Mutex) {
|
||||
img, err := capture.DecodeImage(pkt, decoder, decoderMutex)
|
||||
if err == nil {
|
||||
bytes, _ := computervision.ImageToBytes(img.Image)
|
||||
resizeImage := computervision.ResizeDownscaleImage(img.Image, 4)
|
||||
bytes, _ := computervision.ImageToBytes(resizeImage)
|
||||
encoded := base64.StdEncoding.EncodeToString(bytes)
|
||||
mqttClient.Publish(topic, 0, false, encoded)
|
||||
}
|
||||
|
||||
@@ -3,15 +3,17 @@ package computervision
|
||||
import (
|
||||
"bytes"
|
||||
"image"
|
||||
"image/draw"
|
||||
"image/jpeg"
|
||||
"io/ioutil"
|
||||
"math"
|
||||
"os"
|
||||
"sort"
|
||||
"strconv"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"golang.org/x/image/draw"
|
||||
|
||||
mqtt "github.com/eclipse/paho.mqtt.golang"
|
||||
"github.com/kerberos-io/agent/machinery/src/capture"
|
||||
"github.com/kerberos-io/agent/machinery/src/log"
|
||||
@@ -23,37 +25,38 @@ import (
|
||||
"github.com/kerberos-io/joy4/cgo/ffmpeg"
|
||||
)
|
||||
|
||||
func GetImageImage(pkt av.Packet, dec *ffmpeg.VideoDecoder, decoderMutex *sync.Mutex) (image.YCbCr, error) {
|
||||
func GetImage(pkt av.Packet, dec *ffmpeg.VideoDecoder, decoderMutex *sync.Mutex) (image.YCbCr, error) {
|
||||
rgb, err := capture.DecodeImage(pkt, dec, decoderMutex)
|
||||
return rgb.Image, err
|
||||
}
|
||||
|
||||
func ImageThreshold(img *image.Gray, threshold uint8) *image.Gray {
|
||||
for i := 0; i < len(img.Pix); i++ {
|
||||
if img.Pix[i] < threshold {
|
||||
img.Pix[i] = 0
|
||||
} else {
|
||||
img.Pix[i] = 255
|
||||
}
|
||||
}
|
||||
return img
|
||||
}
|
||||
|
||||
func ImageToGray(img image.YCbCr) *image.Gray {
|
||||
result := image.NewGray(img.Bounds())
|
||||
draw.Draw(result, result.Bounds(), &img, img.Bounds().Min, draw.Src)
|
||||
|
||||
// Scale the image to 1/4 of its original size.
|
||||
scaledImage := image.NewGray(image.Rect(0, 0, result.Bounds().Dx()/4, result.Bounds().Dy()/4))
|
||||
draw.CatmullRom.Scale(scaledImage, scaledImage.Bounds(), result, result.Bounds(), draw.Over, nil)
|
||||
return result
|
||||
}
|
||||
|
||||
func ToBytes(img *image.Gray) ([]byte, error) {
|
||||
buffer := new(bytes.Buffer)
|
||||
err := jpeg.Encode(buffer, img, &jpeg.Options{Quality: 100})
|
||||
return buffer.Bytes(), err
|
||||
func ResizeImage(img image.YCbCr, width int, height int) image.Image {
|
||||
scaledImage := image.NewRGBA(image.Rect(0, 0, width, height))
|
||||
draw.CatmullRom.Scale(scaledImage, scaledImage.Bounds(), &img, img.Bounds(), draw.Over, nil)
|
||||
return scaledImage
|
||||
}
|
||||
|
||||
func ImageToBytes(img image.YCbCr) ([]byte, error) {
|
||||
func ResizeDownscaleImage(img image.YCbCr, dxy int) image.Image {
|
||||
width := img.Bounds().Dx()
|
||||
height := img.Bounds().Dy()
|
||||
scaledImage := image.NewRGBA(image.Rect(0, 0, width/dxy, height/dxy))
|
||||
draw.BiLinear.Scale(scaledImage, scaledImage.Bounds(), &img, img.Bounds(), draw.Over, nil)
|
||||
return scaledImage
|
||||
}
|
||||
|
||||
func ImageToBytes(img image.Image) ([]byte, error) {
|
||||
buffer := new(bytes.Buffer)
|
||||
err := jpeg.Encode(buffer, &img, &jpeg.Options{Quality: 100})
|
||||
err := jpeg.Encode(buffer, img, &jpeg.Options{Quality: 40})
|
||||
return buffer.Bytes(), err
|
||||
}
|
||||
|
||||
@@ -88,7 +91,7 @@ func ProcessMotion(motionCursor *pubsub.QueueCursor, configuration *models.Confi
|
||||
pkt, cursorError = motionCursor.ReadPacket()
|
||||
// Check If valid package.
|
||||
if len(pkt.Data) > 0 && pkt.IsKeyFrame {
|
||||
rgbImage, err := GetImageImage(pkt, decoder, decoderMutex)
|
||||
rgbImage, err := GetImage(pkt, decoder, decoderMutex)
|
||||
if err == nil {
|
||||
grayImage := ImageToGray(rgbImage)
|
||||
imageArray[j] = grayImage
|
||||
@@ -153,7 +156,7 @@ func ProcessMotion(motionCursor *pubsub.QueueCursor, configuration *models.Confi
|
||||
//rgb := GetImage(pkt, decoder, decoderMutex)
|
||||
//gray, _ := ToGray(rgb)
|
||||
//matArray[2] = &gray
|
||||
rgbImage, err := GetImageImage(pkt, decoder, decoderMutex)
|
||||
rgbImage, err := GetImage(pkt, decoder, decoderMutex)
|
||||
if err == nil {
|
||||
grayImage := ImageToGray(rgbImage)
|
||||
imageArray[2] = grayImage
|
||||
@@ -168,16 +171,17 @@ func ProcessMotion(motionCursor *pubsub.QueueCursor, configuration *models.Confi
|
||||
if len(files) > 3 {
|
||||
os.Remove("./data/snapshots/" + files[0].Name())
|
||||
}
|
||||
|
||||
// Rescale image
|
||||
scaledImage := ResizeDownscaleImage(rgbImage, 4)
|
||||
// Save image
|
||||
t := strconv.FormatInt(time.Now().Unix(), 10)
|
||||
f, err := os.Create("./data/snapshots/" + t + ".jpg")
|
||||
if err == nil {
|
||||
jpeg.Encode(f, scaledImage, nil)
|
||||
f.Close()
|
||||
}
|
||||
}
|
||||
|
||||
// Todo snapshot
|
||||
//rgbImage, err := GetImageImage(pkt, decoder, decoderMutex)
|
||||
|
||||
//t := strconv.FormatInt(time.Now().Unix(), 10)
|
||||
//snapshotRGB := GetImage(pkt, decoder, decoderMutex)
|
||||
//gocv.IMWrite("./data/snapshots/"+t+".png", snapshotRGB)
|
||||
//snapshotRGB.Close()
|
||||
|
||||
// Check if continuous recording.
|
||||
if config.Capture.Continuous == "true" {
|
||||
|
||||
|
||||
@@ -141,7 +141,8 @@ logreader:
|
||||
}
|
||||
img, err := capture.DecodeImage(pkt, decoder, decoderMutex)
|
||||
if err == nil {
|
||||
bytes, _ := computervision.ImageToBytes(img.Image)
|
||||
resizeImage := computervision.ResizeDownscaleImage(img.Image, 4)
|
||||
bytes, _ := computervision.ImageToBytes(resizeImage)
|
||||
encodedImage = base64.StdEncoding.EncodeToString(bytes)
|
||||
}
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user