From a0f99a5167596dc7c91df08232ac695797ffe0ee Mon Sep 17 00:00:00 2001 From: Cedric Verstraeten Date: Tue, 7 Feb 2023 13:55:38 +0100 Subject: [PATCH] add two new variables to disable snapshotting (encoding time) + disable motion --- machinery/src/components/Config.go | 6 +++ machinery/src/computervision/main.go | 73 ++++++++++++++-------------- machinery/src/models/Config.go | 2 + 3 files changed, 44 insertions(+), 37 deletions(-) diff --git a/machinery/src/components/Config.go b/machinery/src/components/Config.go index a91c547..7db7278 100644 --- a/machinery/src/components/Config.go +++ b/machinery/src/components/Config.go @@ -244,6 +244,12 @@ func OverrideWithEnvironmentVariables(configuration *models.Configuration) { case "AGENT_CAPTURE_CONTINUOUS": configuration.Config.Capture.Continuous = value break + case "AGENT_CAPTURE_MOTION": + configuration.Config.Capture.Motion = value + break + case "AGENT_CAPTURE_SNAPSHOTS": + configuration.Config.Capture.Snapshots = value + break case "AGENT_CAPTURE_PRERECORDING": duration, err := strconv.ParseInt(value, 10, 64) if err == nil { diff --git a/machinery/src/computervision/main.go b/machinery/src/computervision/main.go index edeac36..ac36ca5 100644 --- a/machinery/src/computervision/main.go +++ b/machinery/src/computervision/main.go @@ -39,12 +39,7 @@ func ProcessMotion(motionCursor *pubsub.QueueCursor, configuration *models.Confi pixelThreshold = 150 } - if config.Capture.Recording == "false" { - - // We might later add the option to still detect motion, but not record. - log.Log.Info("ProcessMotion: Recording disabled, so we do not need motion detection either.") - - } else if config.Capture.Continuous == "true" { + if config.Capture.Continuous == "true" { log.Log.Info("ProcessMotion: Continuous recording, so no motion detection.") @@ -134,23 +129,25 @@ func ProcessMotion(motionCursor *pubsub.QueueCursor, configuration *models.Confi } // Store snapshots (jpg) for hull. - files, err := ioutil.ReadDir("./data/snapshots") - if err == nil { - rgbImage, err := GetRawImage(frame, pkt, decoder, decoderMutex) + if config.Capture.Snapshots != "false" { + files, err := ioutil.ReadDir("./data/snapshots") if err == nil { - sort.Slice(files, func(i, j int) bool { - return files[i].ModTime().Before(files[j].ModTime()) - }) - if len(files) > 3 { - os.Remove("./data/snapshots/" + files[0].Name()) - } - - // Save image - t := strconv.FormatInt(time.Now().Unix(), 10) - f, err := os.Create("./data/snapshots/" + t + ".jpg") + rgbImage, err := GetRawImage(frame, pkt, decoder, decoderMutex) if err == nil { - jpeg.Encode(f, &rgbImage.Image, &jpeg.Options{Quality: 15}) - f.Close() + sort.Slice(files, func(i, j int) bool { + return files[i].ModTime().Before(files[j].ModTime()) + }) + if len(files) > 3 { + os.Remove("./data/snapshots/" + files[0].Name()) + } + + // Save image + t := strconv.FormatInt(time.Now().Unix(), 10) + f, err := os.Create("./data/snapshots/" + t + ".jpg") + if err == nil { + jpeg.Encode(f, &rgbImage.Image, &jpeg.Options{Quality: 15}) + f.Close() + } } } } @@ -178,26 +175,29 @@ func ProcessMotion(motionCursor *pubsub.QueueCursor, configuration *models.Confi } } - // Remember additional information about the result of findmotion - isPixelChangeThresholdReached, changesToReturn = FindMotion(imageArray, coordinatesToCheck, pixelThreshold) + if config.Capture.Motion != "false" { - if detectMotion && isPixelChangeThresholdReached { + // Remember additional information about the result of findmotion + isPixelChangeThresholdReached, changesToReturn = FindMotion(imageArray, coordinatesToCheck, pixelThreshold) + if detectMotion && isPixelChangeThresholdReached { - if mqttClient != nil { - mqttClient.Publish("kerberos/"+key+"/device/"+config.Key+"/motion", 2, false, "motion") - } + if mqttClient != nil { + mqttClient.Publish("kerberos/"+key+"/device/"+config.Key+"/motion", 2, false, "motion") + } - //FIXME: In the future MotionDataPartial should be replaced with MotionDataFull - dataToPass := models.MotionDataPartial{ - Timestamp: time.Now().Unix(), - NumberOfChanges: changesToReturn, + if config.Capture.Recording != "false" { + dataToPass := models.MotionDataPartial{ + Timestamp: time.Now().Unix(), + NumberOfChanges: changesToReturn, + } + communication.HandleMotion <- dataToPass //Save data to the channel + } } - communication.HandleMotion <- dataToPass //Save data to the channel - } - imageArray[0] = imageArray[1] - imageArray[1] = imageArray[2] - i++ + imageArray[0] = imageArray[1] + imageArray[1] = imageArray[2] + i++ + } } if img != nil { @@ -239,7 +239,6 @@ func GetRawImage(frame *ffmpeg.VideoFrame, pkt av.Packet, dec *ffmpeg.VideoDecod func ImageToBytes(img image.Image) ([]byte, error) { buffer := new(bytes.Buffer) w := bufio.NewWriter(buffer) - //err := jpeg.Encode(w, img, &jpeg.EncoderOptions{Quality: 70}) err := jpeg.Encode(w, img, &jpeg.Options{Quality: 15}) return buffer.Bytes(), err } diff --git a/machinery/src/models/Config.go b/machinery/src/models/Config.go index efe839b..2ffb6ab 100644 --- a/machinery/src/models/Config.go +++ b/machinery/src/models/Config.go @@ -51,6 +51,8 @@ type Capture struct { RaspiCamera RaspiCamera `json:"raspicamera"` Recording string `json:"recording,omitempty"` Continuous string `json:"continuous,omitempty"` + Snapshots string `json:"snapshots,omitempty"` + Motion string `json:"motion,omitempty"` PostRecording int64 `json:"postrecording"` PreRecording int64 `json:"prerecording"` MaxLengthRecording int64 `json:"maxlengthrecording"`