From c4f24f4d428598cfa910db4c11b45827a2043567 Mon Sep 17 00:00:00 2001 From: ysandler Date: Sat, 16 Jan 2021 22:33:47 -0600 Subject: [PATCH] feat: object locator --- src/UseCases/ObjectLocator.ts | 37 +++++++++++++++++++++++++++++++++++ src/app.ts | 10 +++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 src/UseCases/ObjectLocator.ts diff --git a/src/UseCases/ObjectLocator.ts b/src/UseCases/ObjectLocator.ts new file mode 100644 index 0000000..8aa5565 --- /dev/null +++ b/src/UseCases/ObjectLocator.ts @@ -0,0 +1,37 @@ +import PredictedObject from "../Models/PredictedObject" +import Video from "../Models/Video" + +interface Offset { + x: number, + y: number, + hypotenuse: number +} + +class ObjectLocator { + private video: Video + constructor (video: Video) { + this.video = video + } + + detectPredictedObjectLocationFromVideo = (predictedObject: PredictedObject): Offset => { + const videoCenter = { x: this.video.width / 2, y: this.video.height / 2 } + const objectCenter = { + x: predictedObject.xOrigin + (predictedObject.width / 2), + y: predictedObject.yOrigin + (predictedObject.height / 2) + } + + + const xOffset = videoCenter.x - objectCenter.x + const yOffset = videoCenter.y - objectCenter.y + + const objectOffsetFromVideoCenter = { + x: xOffset, + y: yOffset, + hypotenuse: Math.sqrt((xOffset * xOffset) + (yOffset * yOffset)) + } + + return objectOffsetFromVideoCenter + } +} + +export default ObjectLocator diff --git a/src/app.ts b/src/app.ts index 4035665..00f2e11 100644 --- a/src/app.ts +++ b/src/app.ts @@ -2,21 +2,24 @@ import { DetectedObject } from "@tensorflow-models/coco-ssd" import PredictedObjectCollectionController from "./Controllers/PredictedObjectCollectionController" import VideoController from './Controllers/VideoController' import ObjectDetector from './UseCases/ObjectDetector' +import ObjectLocator from "./UseCases/ObjectLocator" const defaultPredictions = [ (prediction: DetectedObject) => prediction.score > 0.6, - (prediction: DetectedObject) => prediction.class === 'cat', + (prediction: DetectedObject) => prediction.class === 'person', // TODO: change to cat ] class App { private predictedObjectCollectionController: PredictedObjectCollectionController private videoController: VideoController private objectDetector: ObjectDetector + private objectLocator: ObjectLocator constructor () { this.objectDetector = new ObjectDetector({ filterPredicates: defaultPredictions }) this.predictedObjectCollectionController = new PredictedObjectCollectionController() this.videoController = new VideoController({ width: 640, height: 480 }) + this.objectLocator = new ObjectLocator(this.videoController.model) this.predictImage() } @@ -30,6 +33,11 @@ class App { const predictedObjects = await this.objectDetector.predictImageStream(imageData) this.predictedObjectCollectionController.predictedObjects = predictedObjects + const offsets = predictedObjects.map(obj => { + return this.objectLocator.detectPredictedObjectLocationFromVideo(obj) + }) + + console.log(offsets) window.requestAnimationFrame(this.predictImage) }