From 7dc1f9736a763e77cd0c8a536dbea378f626bf3b Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Mon, 6 Mar 2023 10:10:16 -0800 Subject: [PATCH] pam-diff: add support for motion objects --- plugins/pam-diff/package-lock.json | 4 +-- plugins/pam-diff/package.json | 2 +- plugins/pam-diff/src/main.ts | 47 ++++++++++++++++++++++-------- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/plugins/pam-diff/package-lock.json b/plugins/pam-diff/package-lock.json index 65191a5c0..33ac32683 100644 --- a/plugins/pam-diff/package-lock.json +++ b/plugins/pam-diff/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/pam-diff", - "version": "0.0.15", + "version": "0.0.16", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/pam-diff", - "version": "0.0.15", + "version": "0.0.16", "hasInstallScript": true, "dependencies": { "@types/node": "^16.6.1", diff --git a/plugins/pam-diff/package.json b/plugins/pam-diff/package.json index b6f1fe6d8..f4b343d5f 100644 --- a/plugins/pam-diff/package.json +++ b/plugins/pam-diff/package.json @@ -43,5 +43,5 @@ "devDependencies": { "@scrypted/sdk": "file:../../sdk" }, - "version": "0.0.15" + "version": "0.0.16" } diff --git a/plugins/pam-diff/src/main.ts b/plugins/pam-diff/src/main.ts index 488c9976f..6810019ec 100644 --- a/plugins/pam-diff/src/main.ts +++ b/plugins/pam-diff/src/main.ts @@ -1,4 +1,4 @@ -import { FFmpegInput, MediaObject, ObjectDetection, ObjectDetectionCallbacks, ObjectDetectionModel, ObjectDetectionSession, ObjectsDetected, ScryptedDeviceBase, ScryptedInterface, ScryptedMimeTypes } from '@scrypted/sdk'; +import { ObjectDetectionResult, FFmpegInput, MediaObject, ObjectDetection, ObjectDetectionCallbacks, ObjectDetectionModel, ObjectDetectionSession, ObjectsDetected, ScryptedDeviceBase, ScryptedInterface, ScryptedMimeTypes } from '@scrypted/sdk'; import sdk from '@scrypted/sdk'; import { ffmpegLogInitialOutput, safeKillFFmpeg, safePrintFFmpegArguments } from "../../../common/src/media-helpers"; @@ -121,22 +121,42 @@ class PamDiff extends ScryptedDeviceBase implements ObjectDetection { const p2p = new P2P(); const pamDiff = new PD({ - difference: 9, - percent: 75, - response: 'percent', + difference: session.settings?.difference || defaultDifference, + percent: session.settings?.percent || defaultPercentage, + response: session?.settings?.motionAsObjects ? 'blobs' : 'percent', }); pamDiff.on('diff', async (data: any) => { + const trigger = data.trigger[0]; + // console.log(trigger.blobs.length); + const { blobs } = trigger; + + const detections: ObjectDetectionResult[] = []; + if (blobs?.length) { + for (const blob of blobs) { + detections.push( + { + className: 'motion', + score: trigger.percent / 100, + boundingBox: [blob.minX, blob.minY, blob.maxX - blob.minX, blob.maxY - blob.minY], + } + ) + } + } + else { + detections.push( + { + className: 'motion', + score: trigger.percent / 100, + } + ) + } const event: ObjectsDetected = { timestamp: Date.now(), running: true, detectionId: pds.id, - detections: [ - { - className: 'motion', - score: data.trigger[0].percent / 100, - } - ] + inputDimensions: [640, 360], + detections, } if (pds.callbacks) { pds.callbacks.onDetection(event); @@ -149,10 +169,13 @@ class PamDiff extends ScryptedDeviceBase implements ObjectDetection { const console = sdk.deviceManager.getMixinConsole(mediaObject.sourceId, this.nativeId); pds.pamDiff = pamDiff; - pds.pamDiff.setDifference(session.settings?.difference || defaultDifference).setPercent(session.settings?.percent || defaultPercentage); + pds.pamDiff + .setDifference(session.settings?.difference || defaultDifference) + .setPercent(session.settings?.percent || defaultPercentage) + .setResponse(session?.settings?.motionAsObjects ? 'blobs' : 'percent');; safePrintFFmpegArguments(console, args); pds.cp = child_process.spawn(ffmpeg, args, { - stdio:[ 'inherit', 'pipe', 'pipe', 'pipe'] + stdio: ['inherit', 'pipe', 'pipe', 'pipe'] }); let pamTimeout: NodeJS.Timeout; const resetTimeout = () => {