add resizing methods

This commit is contained in:
Cedric Verstraeten
2023-01-17 22:45:01 +01:00
parent bfb72e8268
commit 4fbcfbc99d
5 changed files with 44 additions and 32 deletions
+2
View File
@@ -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
+4
View File
@@ -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=
+2 -1
View File
@@ -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)
}
+34 -30
View File
@@ -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" {
+2 -1
View File
@@ -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 {